Skip to content

Commit c086685

Browse files
joanheywalkor
andauthored
[php] Workeman update to PHP 8.4 (#9417)
* Remove pgsql tests for swoole and swow * Code optimization * Update workerman.dockerfile to PHP/8. * Update workerman-jit.dockerfile to PHP/8.4 * Update workerman-mysql-jit.dockerfile to PHP/8.4 * Update workerman-pgsql-jit.dockerfile to PHP/8.4 #9408 * Update workerman-pgsql.dockerfile to PHP/8.4 #9408 --------- Co-authored-by: walkor <[email protected]>
1 parent 61ee574 commit c086685

15 files changed

+59
-130
lines changed

frameworks/PHP/workerman/Mysql.php

+4-12
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,9 @@ function db(): array
3232

3333
function query($request): array
3434
{
35-
$query_count = 1;
36-
$q = (int)$request->get('q');
37-
if ($q > 1) {
38-
$query_count = min($q, 500);
39-
}
35+
$count = min(max((int) $request->get('q'), 1), 500);
4036
$arr = [];
41-
while ($query_count--) {
37+
while ($count--) {
4238
$this->world->execute([mt_rand(1, 10000)]);
4339
$arr[] = $this->world->fetch();
4440
}
@@ -47,13 +43,9 @@ function query($request): array
4743

4844
function update($request): array
4945
{
50-
$query_count = 1;
51-
$q = (int)$request->get('q');
52-
if ($q > 1) {
53-
$query_count = min($q, 500);
54-
}
46+
$count = min(max((int) $request->get('q'), 1), 500);
5547
$arr = [];
56-
while ($query_count--) {
48+
while ($count--) {
5749
$id = mt_rand(1, 10000);
5850
$this->world->execute([$id]);
5951
$item = $this->world->fetch();

frameworks/PHP/workerman/MysqlSwoole.php

+4-12
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,11 @@ function db(): array
3131

3232
function query($request): array
3333
{
34-
$query_count = 1;
35-
$q = (int)$request->get('q');
36-
if ($q > 1) {
37-
$query_count = min($q, 500);
38-
}
34+
$count = min(max((int) $request->get('q'), 1), 500);
3935
$pdo = $this->pool->get();
4036
$stmt = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
4137
$arr = [];
42-
while ($query_count--) {
38+
while ($count--) {
4339
$stmt->execute([mt_rand(1, 10000)]);
4440
$arr[] = $stmt->fetch(PDO::FETCH_ASSOC);
4541
}
@@ -49,16 +45,12 @@ function query($request): array
4945

5046
function update($request): array
5147
{
52-
$query_count = 1;
53-
$q = (int)$request->get('q');
54-
if ($q > 1) {
55-
$query_count = min($q, 500);
56-
}
48+
$count = min(max((int) $request->get('q'), 1), 500);
5749
$arr = [];
5850
$pdo = $this->pool->get();
5951
$world = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
6052
$update = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?');
61-
while ($query_count--) {
53+
while ($count--) {
6254
$id = mt_rand(1, 10000);
6355
$world->execute([$id]);
6456
$item = $world->fetch(PDO::FETCH_ASSOC);

frameworks/PHP/workerman/Pgsql.php

+13-29
Original file line numberDiff line numberDiff line change
@@ -28,37 +28,21 @@ public function __construct()
2828

2929
function update($request): array
3030
{
31-
$query_count = 1;
32-
$q = (int)$request->get('q');
33-
if ($q > 1) {
34-
$query_count = min($q, 500);
31+
$queries = $request->get('q');
32+
$worlds = $keys = $values = [];
33+
$count = min(max((int) $queries, 1), 500);
34+
for ($i = 0; $i < $count; ++ $i) {
35+
$values[] = $keys[] = $id = mt_rand(1, 10000);
36+
$this->random->execute([$id]);
37+
$row = $this->random->fetch();
38+
$values[] = $row['randomNumber'] = mt_rand(1, 10000);
39+
$worlds[] = $row;
3540
}
36-
$worlds = [];
37-
while ($query_count--) {
38-
$this->random->execute([\mt_rand(1, 10000)]);
39-
$world = $this->random->fetch();
40-
$world['randomNumber'] = \mt_rand(1, 10000);
41-
$worlds[] = $world;
41+
if (!isset($this->updates[$count])) {
42+
$sql = 'UPDATE World SET randomNumber = CASE id' . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $count) . 'END WHERE id IN (' . str_repeat('?::INTEGER,', $count - 1) . '?::INTEGER)';
43+
$this->updates[$count] = $this->pdo->prepare($sql);
4244
}
43-
$rows = count($worlds);
44-
45-
if (!isset($this->updates[$rows])) {
46-
$sql = 'UPDATE world SET randomNumber = CASE id'
47-
. str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows)
48-
. 'END WHERE id IN ('
49-
. str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)';
50-
51-
$this->updates[$rows] = $this->pdo->prepare($sql);
52-
}
53-
54-
$val = [];
55-
$keys = [];
56-
foreach ($worlds as $world) {
57-
$val[] = $keys[] = $world['id'];
58-
$val[] = $world['randomNumber'];
59-
}
60-
61-
$this->updates[$rows]->execute([...$val, ...$keys]);
45+
$this->updates[$count]->execute([...$values, ...$keys]);
6246
return $worlds;
6347
}
6448

frameworks/PHP/workerman/PgsqlSwoole.php

+2-6
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,11 @@ public function __construct($size)
2323

2424
function update($request): array
2525
{
26-
$query_count = 1;
27-
$q = (int)$request->get('q');
28-
if ($q > 1) {
29-
$query_count = min($q, 500);
30-
}
26+
$count = min(max((int) $request->get('q'), 1), 500);
3127
$worlds = [];
3228
$pdo = $this->pool->get();
3329
$random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
34-
while ($query_count--) {
30+
while ($count--) {
3531
$random->execute([mt_rand(1, 10000)]);
3632
$world = $random->fetch(PDO::FETCH_ASSOC);
3733
$world['randomNumber'] = mt_rand(1, 10000);

frameworks/PHP/workerman/benchmark_config.json

-44
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,6 @@
108108
"notes": "",
109109
"versus": "php"
110110
},
111-
"pgsql-swow": {
112-
"dockerfile": "workerman-pgsql-swow-jit.dockerfile",
113-
"db_url": "/db",
114-
"query_url": "/query?q=",
115-
"update_url": "/update?q=",
116-
"fortune_url": "/fortunes",
117-
"port": 8080,
118-
"approach": "Realistic",
119-
"classification": "Platform",
120-
"database": "Postgres",
121-
"framework": "workerman",
122-
"language": "PHP",
123-
"flavor": "PHP8",
124-
"orm": "Raw",
125-
"platform": "workerman",
126-
"webserver": "None",
127-
"os": "Linux",
128-
"database_os": "Linux",
129-
"display_name": "workerman [jit, pgsql, swow, async]",
130-
"notes": "",
131-
"versus": "php"
132-
},
133111
"mysql-swow": {
134112
"dockerfile": "workerman-mysql-swow-jit.dockerfile",
135113
"db_url": "/db",
@@ -152,28 +130,6 @@
152130
"notes": "",
153131
"versus": "php"
154132
},
155-
"pgsql-swoole": {
156-
"dockerfile": "workerman-pgsql-swoole-jit.dockerfile",
157-
"db_url": "/db",
158-
"query_url": "/query?q=",
159-
"update_url": "/update?q=",
160-
"fortune_url": "/fortunes",
161-
"port": 8080,
162-
"approach": "Realistic",
163-
"classification": "Platform",
164-
"database": "Postgres",
165-
"framework": "workerman",
166-
"language": "PHP",
167-
"flavor": "PHP8",
168-
"orm": "Raw",
169-
"platform": "workerman",
170-
"webserver": "None",
171-
"os": "Linux",
172-
"database_os": "Linux",
173-
"display_name": "workerman [jit, pgsql, swoole, async]",
174-
"notes": "",
175-
"versus": "php"
176-
},
177133
"mysql-swoole": {
178134
"dockerfile": "workerman-mysql-swoole-jit.dockerfile",
179135
"db_url": "/db",

frameworks/PHP/workerman/server.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22
require_once __DIR__.'/vendor/autoload.php';
33

4+
use Swoole\Coroutine;
45
use Workerman\Worker;
56
use Workerman\Events\Swow;
67
use Workerman\Events\Swoole;
@@ -11,10 +12,11 @@
1112
$process = getenv('PROCESS_MULTIPLIER') ?: 1;
1213
$pool_size = getenv('POOL_SIZE') ?: 2;
1314
$process_count = (int) shell_exec('nproc') * $process;
15+
$event_loop = getenv('EVENT_LOOP');
1416

1517
$db = $date = null;
1618
$http_worker = new Worker('http://0.0.0.0:8080');
17-
//$http_worker->reusePort = true;
19+
$http_worker->reusePort = true;
1820
$http_worker->count = $process_count;
1921
$http_worker->onWorkerStart = static function () use ($test_type, $pool_size, &$db, &$date) {
2022
$db = match ($test_type) {
@@ -28,12 +30,10 @@
2830
};
2931
$date = new Date();
3032
};
31-
if ($test_type === 'default') {
32-
Worker::$eventLoopClass = Select::class;
33-
} elseif (in_array($test_type, ['pgsql-swow', 'mysql-swow'])) {
34-
Worker::$eventLoopClass = Swow::class;
35-
} elseif (in_array($test_type, ['pgsql-swoole', 'mysql-swoole'])) {
36-
Worker::$eventLoopClass = Swoole::class;
33+
34+
Worker::$eventLoopClass = "Workerman\\Events\\$event_loop";
35+
if ($event_loop === 'Swoole') {
36+
Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]);
3737
}
3838

3939
$http_worker->onMessage = static function ($connection, $request) use (&$db, &$date) {

frameworks/PHP/workerman/workerman-jit.dockerfile

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ FROM ubuntu:24.04
22

33
ENV TEST_TYPE default
44
ENV PROCESS_MULTIPLIER 1
5+
ENV EVENT_LOOP Select
56

67
ARG DEBIAN_FRONTEND=noninteractive
78

89
RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
910
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
1011
apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
1112

12-
RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null
13+
RUN apt-get install -yqq php8.4-cli php8.4-mysql php8.4-xml > /dev/null
1314

1415
COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
1516

16-
RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
17-
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
17+
RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \
18+
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini
1819

1920
WORKDIR /workerman
2021
COPY --link . .
2122

2223
RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
23-
COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
24+
COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini
2425

2526
EXPOSE 8080
2627

frameworks/PHP/workerman/workerman-mysql-jit.dockerfile

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ FROM ubuntu:24.04
22

33
ENV TEST_TYPE mysql
44
ENV PROCESS_MULTIPLIER 4
5+
ENV EVENT_LOOP Event
56

67
ARG DEBIAN_FRONTEND=noninteractive
78

89
RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
910
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
1011
apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
1112

12-
RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null
13+
RUN apt-get install -yqq php8.4-cli php8.4-mysql php8.4-xml > /dev/null
1314

1415
COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
1516

16-
RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
17-
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
17+
RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \
18+
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini
1819

1920
WORKDIR /workerman
2021
COPY --link . .
2122

2223
RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
23-
COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
24+
COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini
2425

2526
EXPOSE 8080
2627

frameworks/PHP/workerman/workerman-mysql-swoole-jit.dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ ENV TEST_TYPE mysql-swoole
44
ENV SWOOLE_VERSION 5.1.5
55
ENV PROCESS_MULTIPLIER 1
66
ENV POOL_SIZE 4
7+
ENV EVENT_LOOP Swoole
78

89
ARG DEBIAN_FRONTEND=noninteractive
910

frameworks/PHP/workerman/workerman-mysql-swow-jit.dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ FROM ubuntu:24.04
33
ENV TEST_TYPE mysql-swow
44
ENV PROCESS_MULTIPLIER 1
55
ENV POOL_SIZE 4
6+
ENV EVENT_LOOP Swow
67

78
ARG DEBIAN_FRONTEND=noninteractive
89

frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ FROM ubuntu:24.04
22

33
ENV TEST_TYPE pgsql
44
ENV PROCESS_MULTIPLIER 4
5+
ENV EVENT_LOOP Event
56

67
ARG DEBIAN_FRONTEND=noninteractive
78

89
RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
910
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
1011
apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
1112

12-
RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
13+
RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-xml > /dev/null
1314

1415
COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
1516

16-
RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
17-
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
17+
RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \
18+
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini
1819

1920
WORKDIR /workerman
2021
COPY --link . .
2122

2223
RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
23-
COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
24+
COPY php-jit.ini /etc/php/8.4/cli/conf.d/10-opcache.ini
2425

2526
EXPOSE 8080
2627

frameworks/PHP/workerman/workerman-pgsql-swoole-jit.dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ ENV TEST_TYPE pgsql-swoole
44
ENV SWOOLE_VERSION 5.1.5
55
ENV PROCESS_MULTIPLIER 2
66
ENV POOL_SIZE 16
7+
ENV EVENT_LOOP Swoole
78

89
ARG DEBIAN_FRONTEND=noninteractive
910

frameworks/PHP/workerman/workerman-pgsql-swow-jit.dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ FROM ubuntu:24.04
33
ENV TEST_TYPE pgsql-swow
44
ENV PROCESS_MULTIPLIER 2
55
ENV POOL_SIZE 16
6+
ENV EVENT_LOOP Swow
67

78
ARG DEBIAN_FRONTEND=noninteractive
89

frameworks/PHP/workerman/workerman-pgsql.dockerfile

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ FROM ubuntu:24.04
22

33
ENV TEST_TYPE pgsql
44
ENV PROCESS_MULTIPLIER 4
5+
ENV EVENT_LOOP Event
56

67
ARG DEBIAN_FRONTEND=noninteractive
78

89
RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
910
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
1011
apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
1112

12-
RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
13+
RUN apt-get install -yqq php8.4-cli php8.4-pgsql php8.4-xml > /dev/null
1314

1415
COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
1516

16-
RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
17-
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
17+
RUN apt-get install -y php-pear php8.4-dev libevent-dev git > /dev/null && \
18+
pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.4/cli/conf.d/30-event.ini
1819

1920
WORKDIR /workerman
2021
COPY --link . .
2122

2223
RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
23-
COPY php.ini /etc/php/8.3/cli/php.ini
24+
COPY php.ini /etc/php/8.4/cli/php.ini
2425

2526
EXPOSE 8080
2627

0 commit comments

Comments
 (0)