Browse Source

[PHP]update swoole version to 5.1.4 (#9229)

* update swoole version to 5.1.4

* update container to 24.04

* cache statement for coroutine type
MARiA so cute 11 months ago
parent
commit
33044001ca

+ 75 - 37
frameworks/PHP/swoole/database.php

@@ -21,14 +21,14 @@ class Operation
     public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string
     {
         $fortune->execute();
-        $results = $fortune->fetchAll(PDO::FETCH_KEY_PAIR);
+        $results    = $fortune->fetchAll(PDO::FETCH_KEY_PAIR);
         $results[0] = 'Additional fortune added at request time.';
         asort($results);
 
         $html = '';
         foreach ($results as $id => $message) {
             $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
-            $html .= "<tr><td>$id</td><td>$message</td></tr>";
+            $html    .= "<tr><td>$id</td><td>$message</td></tr>";
         }
 
         return "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>$html</table></body></html>";
@@ -36,13 +36,8 @@ class Operation
 
     public static function query(PDOStatement|PDOStatementProxy $query, int $queries): string
     {
-        $query_count = 1;
-        if ($queries > 1) {
-            $query_count = min($queries, 500);
-        }
-
         $results = [];
-        while ($query_count--) {
+        while ($queries--) {
             $query->execute([mt_rand(1, 10000)]);
             $results[] = $query->fetch(PDO::FETCH_ASSOC);
         }
@@ -50,33 +45,38 @@ class Operation
         return json_encode($results, JSON_NUMERIC_CHECK);
     }
 
-    public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries): string
+    public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries, string $driver): string
     {
-        $query_count = 1;
-        if ($queries > 1) {
-            $query_count = min($queries, 500);
-        }
-
-        $results = [];
-        while ($query_count--) {
-            $id = mt_rand(1, 10000);
-            $random->execute([$id]);
-            $item = $random->fetch(PDO::FETCH_ASSOC);
-            $update->execute([$item['randomNumber'] = mt_rand(1, 10000), $id]);
+        $results = $keys = $values = [];
+        while ($queries--) {
+            $random->execute([mt_rand(1, 10000)]);
+            $item                 = $random->fetch(PDO::FETCH_ASSOC);
+            $item['randomNumber'] = mt_rand(1, 10000);
+            $results[]            = $item;
 
-            $results[] = $item;
+            if ($driver == 'pgsql') {
+                $values[] = $keys[] = $item['id'];
+                $values[] = $item['randomNumber'];
+            } else {
+                $update->execute([$item['randomNumber'], $item['id']]);
+            }
         }
 
+        if ($driver == 'pgsql') {
+            $update->execute([...$values, ...$keys]);
+        }
         return json_encode($results, JSON_NUMERIC_CHECK);
     }
 }
 
 class Connection
 {
+    private static PDO $pdo;
+    private static string $driver;
+    private static array $updates = [];
     private static PDOStatement $db;
     private static PDOStatement $fortune;
     private static PDOStatement $random;
-    private static PDOStatement $update;
     private static PDOStatement $query;
 
     public static function init(string $driver): void
@@ -87,15 +87,16 @@ class Connection
             "benchmarkdbpass",
             [
                 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
-                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
-                PDO::ATTR_EMULATE_PREPARES => false
+                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
+                PDO::ATTR_EMULATE_PREPARES   => false
             ]
         );
 
-        self::$db = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL);
+        self::$db      = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL);
         self::$fortune = $pdo->prepare(Operation::FORTUNE_SQL);
-        self::$update = $pdo->prepare(Operation::WORLD_UPDATE_SQL);
 
+        self::$pdo    = $pdo;
+        self::$driver = $driver;
     }
 
     public static function db(): string
@@ -115,13 +116,23 @@ class Connection
 
     public static function updates(int $queries): string
     {
-        return Operation::updates(self::$random, self::$update, $queries);
+        if (!isset(self::$updates[$queries])) {
+            self::$updates[$queries] = self::$driver == 'pgsql'
+                ? self::$pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)')
+                : self::$pdo->prepare(Operation::WORLD_UPDATE_SQL);
+        }
+
+        return Operation::updates(self::$random, self::$updates[$queries], $queries, self::$driver);
     }
 }
 
 class Connections
 {
     private static PDOPool $pool;
+    private static string $driver;
+    private static array $dbs = [];
+    private static array $fortunes = [];
+    private static array $updates = [];
 
     public static function init(string $driver): void
     {
@@ -133,22 +144,22 @@ class Connections
             ->withUsername('benchmarkdbuser')
             ->withPassword('benchmarkdbpass');
 
-        self::$pool = new PDOPool($config, intval(1024 / swoole_cpu_num()));
+        self::$pool   = new PDOPool($config, 128);
+        self::$driver = $driver;
     }
 
     public static function db(): string
     {
-        $pdo = self::get();
-        $result = Operation::db($pdo->prepare(Operation::WORLD_SELECT_SQL));
+        $pdo    = self::get();
+        $result = Operation::db(self::getStatement($pdo, 'select'));
         self::put($pdo);
-
         return $result;
     }
 
     public static function fortunes(): string
     {
-        $pdo = self::get();
-        $result = Operation::fortunes($pdo->prepare(Operation::FORTUNE_SQL));
+        $pdo    = self::get();
+        $result = Operation::fortunes(self::getStatement($pdo, 'fortunes'));
         self::put($pdo);
 
         return $result;
@@ -156,8 +167,8 @@ class Connections
 
     public static function query(int $queries): string
     {
-        $pdo = self::get();
-        $result = Operation::query($pdo->prepare(Operation::WORLD_SELECT_SQL), $queries);
+        $pdo    = self::get();
+        $result = Operation::query(self::getStatement($pdo, 'select'), $queries);
         self::put($pdo);
 
         return $result;
@@ -165,8 +176,8 @@ class Connections
 
     public static function updates(int $queries): string
     {
-        $pdo = self::get();
-        $result = Operation::updates($pdo->prepare(Operation::WORLD_SELECT_SQL), $pdo->prepare(Operation::WORLD_UPDATE_SQL), $queries);
+        $pdo    = self::get();
+        $result = Operation::updates(self::getStatement($pdo, 'select'), self::getStatement($pdo, 'update', $queries), $queries, self::$driver);
         self::put($pdo);
 
         return $result;
@@ -181,4 +192,31 @@ class Connections
     {
         self::$pool->put($db);
     }
+
+    private static function getStatement(PDO|PDOProxy $pdo, string $type, int $queries = 0): PDOStatement|PDOStatementProxy
+    {
+        $hash = spl_object_id($pdo);
+
+        if ('select' == $type) {
+            if (!isset(self::$dbs[$hash])) {
+                self::$dbs[$hash] = $pdo->prepare(Operation::WORLD_SELECT_SQL);
+            }
+
+            return self::$dbs[$hash];
+        } elseif ('fortunes' == $type) {
+            if (!isset(self::$fortunes[$hash])) {
+                self::$fortunes[$hash] = $pdo->prepare(Operation::FORTUNE_SQL);
+            }
+
+            return self::$fortunes[$hash];
+        } else {
+            if (!isset(self::$updates[$hash][$queries])) {
+                self::$updates[$hash][$queries] = self::$driver == 'pgsql'
+                    ? $pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)')
+                    : $pdo->prepare(Operation::WORLD_UPDATE_SQL);
+            }
+
+            return self::$updates[$hash][$queries];
+        }
+    }
 }

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

@@ -6,4 +6,4 @@ opcache.huge_code_pages=1
 memory_limit=1024M
 
 opcache.jit_buffer_size=128M
-opcache.jit=tracing
+opcache.jit=1225

+ 3 - 3
frameworks/PHP/swoole/swoole-async-mysql.dockerfile

@@ -1,6 +1,6 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
-ENV SWOOLE_VERSION 5.1.1
+ENV SWOOLE_VERSION 5.1.4
 ENV ENABLE_COROUTINE 1
 ENV DATABASE_DRIVER mysql
 
@@ -10,7 +10,7 @@ RUN apt update -yqq > /dev/null \
     && apt install -yqq software-properties-common > /dev/null \
     && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \
     && apt update -yqq > /dev/null \
-    && apt install php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \
+    && apt install libbrotli-dev php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \
     && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
     && cd /tmp/swoole-src-${SWOOLE_VERSION} \
     && phpize > /dev/null \

+ 3 - 3
frameworks/PHP/swoole/swoole-async-postgres.dockerfile

@@ -1,6 +1,6 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
-ENV SWOOLE_VERSION 5.1.1
+ENV SWOOLE_VERSION 5.1.4
 ENV ENABLE_COROUTINE 1
 ENV DATABASE_DRIVER pgsql
 
@@ -10,7 +10,7 @@ RUN apt update -yqq > /dev/null \
     && apt install -yqq software-properties-common > /dev/null \
     && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \
     && apt update -yqq > /dev/null \
-    && apt install php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \
+    && apt install libbrotli-dev php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \
     && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
     && cd /tmp/swoole-src-${SWOOLE_VERSION} \
     && phpize > /dev/null \

+ 8 - 6
frameworks/PHP/swoole/swoole-server.php

@@ -48,16 +48,18 @@ $server->on('request', function (Request $req, Response $res) use ($connection)
                 $res->end($connection::fortunes());
                 break;
             case '/query':
+                $queries     = isset($req->get['queries']) ? (int) $req->get['queries'] : -1;
+                $query_count = $queries > 1 ? min($queries, 500) : 1;
+
                 $res->header['Content-Type'] = 'application/json';
-                $res->end($connection::query(
-                    isset($req->get['queries']) ? (int) $req->get['queries'] : -1
-                ));
+                $res->end($connection::query($query_count));
                 break;
             case '/updates':
+                $queries     = isset($req->get['queries']) ? (int) $req->get['queries'] : -1;
+                $query_count = $queries > 1 ? min($queries, 500) : 1;
+
                 $res->header['Content-Type'] = 'application/json';
-                $res->end($connection::updates(
-                    isset($req->get['queries']) ? (int) $req->get['queries'] : -1
-                ));
+                $res->end($connection::updates($query_count));
                 break;
 
             default:

+ 3 - 3
frameworks/PHP/swoole/swoole-sync-mysql.dockerfile

@@ -1,6 +1,6 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
-ENV SWOOLE_VERSION 5.1.1
+ENV SWOOLE_VERSION 5.1.4
 ENV ENABLE_COROUTINE 0
 ENV DATABASE_DRIVER mysql
 
@@ -10,7 +10,7 @@ RUN apt update -yqq > /dev/null \
     && apt install -yqq software-properties-common > /dev/null \
     && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \
     && apt update -yqq > /dev/null \
-    && apt install php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \
+    && apt install libbrotli-dev php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \
     && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
     && cd /tmp/swoole-src-${SWOOLE_VERSION} \
     && phpize > /dev/null \

+ 3 - 3
frameworks/PHP/swoole/swoole-sync-postgres.dockerfile

@@ -1,6 +1,6 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
-ENV SWOOLE_VERSION 5.1.1
+ENV SWOOLE_VERSION 5.1.4
 ENV ENABLE_COROUTINE 0
 ENV DATABASE_DRIVER pgsql
 
@@ -10,7 +10,7 @@ RUN apt update -yqq > /dev/null \
     && apt install -yqq software-properties-common > /dev/null \
     && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \
     && apt update -yqq > /dev/null \
-    && apt install php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \
+    && apt install libbrotli-dev php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \
     && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \
     && cd /tmp/swoole-src-${SWOOLE_VERSION} \
     && phpize > /dev/null \