Browse Source

[php] Enable jit for workerman and webman (#9258)

* Enable jit and remove unnecessary files

* Remove reusePort

* Add maintainers walkor

* Use the latest event extension

* Use event-3.1.4

* Add without jit tests

* Fix dockerfile name

* Add space to display_name

* save

* Reuseport
walkor 9 months ago
parent
commit
7ccad708d0

+ 21 - 1
frameworks/PHP/webman/benchmark_config.json

@@ -1,9 +1,29 @@
 {
   "framework": "webman",
+  "maintainers": ["walkor"],
   "tests": [{
     "default": {
+      "dockerfile": "webman.dockerfile",
       "json_url": "/json",
       "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "Postgres",
+      "framework": "webman",
+      "language": "PHP",
+      "flavor": "PHP7",
+      "orm": "Raw",
+      "platform": "workerman",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "webman",
+      "notes": "",
+      "versus": "workerman"
+    },
+    "pgsql": {
+      "dockerfile": "webman-pgsql.dockerfile",
       "db_url": "/db",
       "query_url": "/queries/",
       "update_url": "/updates/",
@@ -20,7 +40,7 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "webman",
+      "display_name": "webman-pgsql",
       "notes": "",
       "versus": "workerman"
     }

+ 18 - 0
frameworks/PHP/webman/config.toml

@@ -17,3 +17,21 @@ orm = "Raw"
 platform = "workerman"
 webserver = "None"
 versus = "workerman"
+
+
+[pgsql]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries/"
+urls.update = "/updates/"
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Micro"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "workerman"
+webserver = "None"
+versus = "workerman"

+ 2 - 1
frameworks/PHP/webman/config/server.php

@@ -17,9 +17,10 @@ return [
     'transport'            => 'tcp',
     'context'              => [],
     'name'                 => 'webman',
-    'count'                => cpu_count() * 4,
+    'count'                => cpu_count() * ( getenv('TEST_TYPE') === 'default' ? 1 : 4 ),
     'user'                 => '',
     'group'                => '',
+    'reuse_port'           => true,
     'pid_file' => runtime_path() . '/webman.pid',
     'status_file' => runtime_path() . '/webman.status',
     'stdout_file' => runtime_path() . '/logs/stdout.log',

+ 2 - 4
frameworks/PHP/webman/php.ini

@@ -1,13 +1,11 @@
+zend_extension=opcache.so
 opcache.enable=1
 opcache.enable_cli=1
 opcache.validate_timestamps=0
 opcache.save_comments=0
 opcache.enable_file_override=1
 opcache.huge_code_pages=1
-
 mysqlnd.collect_statistics = Off
-
 memory_limit = 512M
-
 opcache.jit_buffer_size=128M
-opcache.jit=tracing
+opcache.jit=tracing

+ 26 - 0
frameworks/PHP/webman/webman-pgsql.dockerfile

@@ -0,0 +1,26 @@
+FROM ubuntu:24.04
+
+ENV TEST_TYPE pgsql
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
+RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
+    apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
+
+RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
+
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
+
+RUN apt-get update -yqq && apt-get install -y php-pear php8.3-dev libevent-dev git  > /dev/null
+RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
+
+ADD ./ /webman
+WORKDIR /webman
+
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
+
+EXPOSE 8080
+
+CMD php /webman/start.php start

+ 5 - 4
frameworks/PHP/webman/webman.dockerfile

@@ -1,4 +1,6 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
+
+ENV TEST_TYPE default
 
 ARG DEBIAN_FRONTEND=noninteractive
 
@@ -11,14 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 RUN apt-get update -yqq && apt-get install -y php-pear php8.3-dev libevent-dev git  > /dev/null
-RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
-
-COPY php.ini /etc/php/8.3/cli/php.ini
+RUN pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
 
 ADD ./ /webman
 WORKDIR /webman
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
 
 EXPOSE 8080
 

+ 34 - 16
frameworks/PHP/workerman/benchmark_config.json

@@ -1,13 +1,11 @@
 {
   "framework": "workerman",
+  "maintainers": ["walkor"],
   "tests": [{
     "default": {
+      "dockerfile": "workerman-jit.dockerfile",
       "json_url": "/json",
       "plaintext_url": "/plaintext",
-      "db_url": "/db",
-      "query_url": "/query?q=",
-      "update_url": "/update?q=",
-      "fortune_url": "/fortunes",
       "port": 8080,
       "approach": "Realistic",
       "classification": "Platform",
@@ -20,11 +18,12 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "workerman",
+      "display_name": "workerman [jit]",
       "notes": "",
       "versus": "php"
     },
     "pgsql": {
+      "dockerfile": "workerman-pgsql-jit.dockerfile",
       "db_url": "/db",
       "query_url": "/query?q=",
       "update_url": "/update?q=",
@@ -41,12 +40,15 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "workerman-postgres",
+      "display_name": "workerman [jit, pgsql]",
       "notes": "",
       "versus": "php"
     },
-    "async": {
+    "mysql": {
+      "dockerfile": "workerman-mysql-jit.dockerfile",
       "db_url": "/db",
+      "query_url": "/query?q=",
+      "update_url": "/update?q=",
       "fortune_url": "/fortunes",
       "port": 8080,
       "approach": "Realistic",
@@ -54,22 +56,38 @@
       "database": "MySQL",
       "framework": "workerman",
       "language": "PHP",
-      "flavor": "PHP7",
+      "flavor": "PHP8",
       "orm": "Raw",
       "platform": "workerman",
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "workerman-async-db",
+      "display_name": "workerman [jit, mysql]",
       "notes": "",
-      "versus": "php",
-      "tags": [
-        "broken"
-      ]
+      "versus": "php"
     },
-    "php8-jit": {
+    "without-jit": {
+      "dockerfile": "workerman.dockerfile",
       "json_url": "/json",
       "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "workerman",
+      "language": "PHP",
+      "flavor": "PHP8",
+      "orm": "Raw",
+      "platform": "workerman",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "workerman",
+      "notes": "",
+      "versus": "php"
+    },
+    "pgsql-without-jit": {
+      "dockerfile": "workerman-pgsql.dockerfile",
       "db_url": "/db",
       "query_url": "/query?q=",
       "update_url": "/update?q=",
@@ -86,8 +104,8 @@
       "webserver": "None",
       "os": "Linux",
       "database_os": "Linux",
-      "display_name": "workerman-php8-jit",
-      "notes": "php8 jit",
+      "display_name": "workerman [pgsql]",
+      "notes": "",
       "versus": "php"
     }
   }]

+ 23 - 2
frameworks/PHP/workerman/config.toml

@@ -33,7 +33,7 @@ platform = "workerman"
 webserver = "None"
 versus = "php"
 
-[php8-jit]
+[mysql]
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.db = "/db"
@@ -50,8 +50,12 @@ platform = "workerman"
 webserver = "None"
 versus = "php"
 
-[async]
+[without-jit]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
 urls.db = "/db"
+urls.query = "/query?q="
+urls.update = "/update?q="
 urls.fortune = "/fortunes"
 approach = "Realistic"
 classification = "Platform"
@@ -62,3 +66,20 @@ orm = "Raw"
 platform = "workerman"
 webserver = "None"
 versus = "php"
+
+[pgsql-without-jit]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/query?q="
+urls.update = "/update?q="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Platform"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "workerman"
+webserver = "None"
+versus = "php"

+ 2 - 4
frameworks/PHP/workerman/php-jit.ini

@@ -1,13 +1,11 @@
+zend_extension=opcache.so
 opcache.enable=1
 opcache.enable_cli=1
 opcache.validate_timestamps=0
 opcache.save_comments=0
 opcache.enable_file_override=1
 opcache.huge_code_pages=1
-
 mysqlnd.collect_statistics = Off
-
 memory_limit = 512M
-
 opcache.jit_buffer_size=128M
-opcache.jit=tracing
+opcache.jit=tracing

+ 1 - 1
frameworks/PHP/workerman/php.ini

@@ -7,4 +7,4 @@ opcache.huge_code_pages=1
 
 mysqlnd.collect_statistics = Off
 
-memory_limit = 512M
+memory_limit = 512M

+ 0 - 80
frameworks/PHP/workerman/server-async.php

@@ -1,80 +0,0 @@
-<?php
-require_once __DIR__.'/vendor/autoload.php';
-
-use Workerman\Protocols\Http\Response;
-use Workerman\Protocols\Http\Request;
-use Workerman\Worker;
-
-$http_worker                = new Worker('http://0.0.0.0:8080');
-$http_worker->count         = (int) shell_exec('nproc') * 2;
-$http_worker->onWorkerStart = static function() {
-    global $mysql;
-
-    $loop  = Worker::getEventLoop();
-
-    $mysql = new React\MySQL\Connection($loop, [
-        'host'   => 'tfb-database',
-        'dbname' => 'hello_world',
-        'user'   => 'benchmarkdbuser',
-        'passwd' => 'benchmarkdbpass'
-    ]);
-
-    $mysql->on('error', function($e){
-        echo $e;
-    });
-   
-    $mysql->connect(function ($e) {});
-};
-
-$http_worker->onMessage = static function ($connection, $request) {
-
-    global $mysql;
-
-    switch ($request->path()) {
-        case '/db':
-            $mysql->query('SELECT id,randomNumber FROM World WHERE id='.mt_rand(1, 10000),
-                static function ($command) use ($connection) {
-                    $connection->send(new Response(200, ['Content-Type' => 'application/json', 'Date' => gmdate('D, d M Y H:i:s').' GMT'], json_encode($command->resultRows, JSON_NUMERIC_CHECK)));
-                }
-            );
-            return;
-
-        case '/fortunes':
-            // By default use 'Content-Type: text/html; charset=utf-8';
-            $mysql->query('SELECT id,message FROM Fortune', 
-                static function ($command) use ($connection) {
-                    $arr = $command->resultRows;
-                    foreach ($arr as $row) {
-                        $fortune[$row['id']] = htmlspecialchars($row['message'], ENT_QUOTES, 'UTF-8');
-                    }
-                    $fortune[0] = 'Additional fortune added at request time.';
-                    asort($fortune);
-
-                    $html = '<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>';
-                    foreach ($fortune as $id => $message) {
-                        $html .= "<tr><td>$id</td><td>$message</td></tr>";
-                    }
-
-                    $connection->send(new Response(200, ['Date' => gmdate('D, d M Y H:i:s').' GMT'], $html.'</table></body></html>'));
-
-                }
-            );
-            return;
-
-        //case '/update':
-        //    Http::header('Content-Type: application/json');
-        //    return $connection->send(update());
-
-        //case '/info':
-        //   Http::header('Content-Type: text/plain');
-        //   ob_start();
-        //   phpinfo();
-        //   return $connection->send(ob_get_clean());
-
-        default:
-            $connection->send(new Response(200, [], 'Error 404'));
-
-    }
-};
-
-Worker::runAll();

+ 16 - 7
frameworks/PHP/workerman/server.php

@@ -1,29 +1,38 @@
 <?php
 require_once __DIR__.'/vendor/autoload.php';
-require_once __DIR__.'/app.php';
 
 use Workerman\Worker;
 use Workerman\Timer;
 
+$test_type = getenv('TEST_TYPE') ?: 'default';
+if ($test_type === 'pgsql') {
+    require_once __DIR__.'/app-pg.php';
+} else {
+    require_once __DIR__.'/app.php';
+}
+$process_count = (int) shell_exec('nproc') * ($test_type === 'default' ? 1 : 4);
+
 $http_worker                = new Worker('http://0.0.0.0:8080');
-$http_worker->count         = (int) shell_exec('nproc') * 4;
-$http_worker->onWorkerStart = static function () {
+$http_worker->reusePort = true;
+$http_worker->count         = $process_count;
+$http_worker->onWorkerStart = static function () use ($test_type) {
     Header::$date = gmdate('D, d M Y H:i:s').' GMT';
     Timer::add(1, function() {
         Header::$date = gmdate('D, d M Y H:i:s').' GMT';
     });
-    init();
+    if ($test_type === 'pgsql') {
+        DbRaw::init();
+    } else {
+        init();
+    }
 };
 
 $http_worker->onMessage = static function ($connection, $request) {
-
     $connection->send(router($request));
-    
 };
 
 Worker::runAll();
 
-
 class Header {
     public static $date = null;
 }

+ 6 - 6
frameworks/PHP/workerman/workerman-async.dockerfile → frameworks/PHP/workerman/workerman-jit.dockerfile

@@ -1,26 +1,26 @@
 FROM ubuntu:24.04
 
+ENV TEST_TYPE default
+
 ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
 RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
 
-RUN apt-get install -yqq php8.3-cli php8.3-mysql  > /dev/null
+RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null
 
 COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
-    pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
-
-COPY --link php.ini /etc/php/8.3/cli/php.ini
+    pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
 
 WORKDIR /workerman
 COPY --link . .
 
-RUN composer require react/mysql "^0.6" --quiet
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
 
 EXPOSE 8080
 
-CMD php /workerman/server-async.php start
+CMD php /workerman/server.php start

+ 26 - 0
frameworks/PHP/workerman/workerman-mysql-jit.dockerfile

@@ -0,0 +1,26 @@
+FROM ubuntu:24.04
+
+ENV TEST_TYPE mysql
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
+RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
+    apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
+
+RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null
+
+COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
+
+RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
+    pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
+
+WORKDIR /workerman
+COPY --link . .
+
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
+
+EXPOSE 8080
+
+CMD php /workerman/server.php start

+ 4 - 7
frameworks/PHP/workerman/workerman-php8-jit.dockerfile → frameworks/PHP/workerman/workerman-pgsql-jit.dockerfile

@@ -1,5 +1,7 @@
 FROM ubuntu:24.04
 
+ENV TEST_TYPE pgsql
+
 ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
@@ -11,18 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
 COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
-    pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
- 
-COPY --link php-jit.ini /etc/php/8.3/cli/php.ini
+    pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
 
 WORKDIR /workerman
 COPY --link . .
 
-RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php
-RUN sed -i "s|init()|DbRaw::init()|g" server.php
-RUN sed -i "s|opcache.jit=off|opcache.jit=function|g" /etc/php/8.3/cli/conf.d/10-opcache.ini
-
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php-jit.ini /etc/php/8.3/cli/conf.d/10-opcache.ini
 
 EXPOSE 8080
 

+ 4 - 6
frameworks/PHP/workerman/workerman-pgsql.dockerfile

@@ -1,5 +1,7 @@
 FROM ubuntu:24.04
 
+ENV TEST_TYPE pgsql
+
 ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
@@ -11,17 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
 COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
-    pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
-
-COPY --link php.ini /etc/php/8.3/cli/php.ini
+    pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
 
 WORKDIR /workerman
 COPY --link . .
 
-RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php
-RUN sed -i "s|init()|DbRaw::init()|g" server.php
-
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php.ini /etc/php/8.3/cli/php.ini
 
 EXPOSE 8080
 

+ 4 - 3
frameworks/PHP/workerman/workerman.dockerfile

@@ -1,5 +1,7 @@
 FROM ubuntu:24.04
 
+ENV TEST_TYPE default
+
 ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
@@ -11,14 +13,13 @@ RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null
 COPY --from=composer/composer:latest-bin --link /composer /usr/local/bin/composer
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null && \
-    pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
- 
-COPY --link php-jit.ini /etc/php/8.3/cli/php.ini 
+    pecl install event-3.1.4 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/30-event.ini
 
 WORKDIR /workerman
 COPY --link . .
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+COPY php.ini /etc/php/8.3/cli/php.ini
 
 EXPOSE 8080