Browse Source

Add Kumbia raw with workerman (#5665)

* Add Kumbia raw with workerman

* Small change in kumbia raw

* Update case
smaller prepared statement
Joan Miquel 5 years ago
parent
commit
19cece7c0f

+ 48 - 0
frameworks/PHP/kumbiaphp/bench/app/controllers/ku_controller.php

@@ -0,0 +1,48 @@
+<?php
+
+use Workerman\Protocols\Http;
+
+class KuController extends AppController
+{
+
+    protected function before_filter()
+    {
+        View::select(null, null);
+        Http::header('Content-Type: application/json');
+    }
+
+    public function index()
+    {
+        KuRaw::$db->execute([mt_rand(1, 10000)]);
+        echo json_encode(KuRaw::$db->fetch());
+    }
+
+    public function query($count = 1)
+    {
+        $count = min(max($count, 1), 500);
+
+        while ($count--) {
+            KuRaw::$db->execute([mt_rand(1, 10000)]);
+            $worlds[] = KuRaw::$db->fetch();
+        }
+        echo json_encode($worlds);
+    }
+
+    public function update($count = 1)
+    {
+        $count = min(max($count, 1), 500);
+
+        while ($count--) {
+            $id = mt_rand(1, 10000);
+
+            KuRaw::$random->execute([$id]);
+            $row = ['id' => $id, 'randomNumber' => KuRaw::$random->fetchColumn()];
+            $row['randomNumber'] = mt_rand(1, 10000);
+
+            $worlds[] = $row;
+        }
+        KuRaw::update($worlds);
+
+        echo json_encode($worlds);
+    }
+}

+ 20 - 0
frameworks/PHP/kumbiaphp/bench/app/controllers/ku_fortune_controller.php

@@ -0,0 +1,20 @@
+<?php
+
+class KuFortuneController extends AppController
+{
+
+    protected function before_filter()
+    {
+        View::select(null, 'raw');
+    }
+
+    public function index()
+    {
+        KuRaw::$fortune->execute();
+        $arr    = KuRaw::$fortune->fetchAll(PDO::FETCH_KEY_PAIR);
+        $arr[0] = 'Additional fortune added at request time.';
+        asort($arr);
+
+        $this->data = $arr;
+    }
+}

+ 0 - 1
frameworks/PHP/kumbiaphp/bench/app/controllers/raw_controller.php

@@ -45,7 +45,6 @@ class RawController extends AppController
 
             $sth->execute([$id]);
             $row = ['id' => $id, 'randomNumber' => $sth->fetchColumn()];
-            $row['randomNumber'] = mt_rand(1, 10000);
             $updateStatement->execute(
                 [$row['randomNumber'] = mt_rand(1, 10000), $id]
             );

+ 89 - 0
frameworks/PHP/kumbiaphp/bench/app/libs/ku_raw.php

@@ -0,0 +1,89 @@
+<?php
+
+class KuRaw
+{
+    private static PDO $instance;
+    public static PDOStatement $db;
+    public static PDOStatement $fortune;
+    public static PDOStatement $random;
+    /**
+     * @var []PDOStatement
+     */
+    private static $update;
+
+    public static function init()
+    {
+        $pdo = new PDO(
+            'pgsql:host=tfb-database;dbname=hello_world',
+            'benchmarkdbuser',
+            'benchmarkdbpass',
+            [
+                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+                PDO::ATTR_ERRMODE             => PDO::ERRMODE_EXCEPTION,
+                PDO::ATTR_EMULATE_PREPARES    => false
+            ]
+        );
+
+        self::$db        = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
+        self::$fortune   = $pdo->prepare('SELECT id,message FROM Fortune');
+        self::$random    = $pdo->prepare('SELECT randomNumber FROM World WHERE id = ?');
+        self::$instance  = $pdo;
+    }
+
+    /**
+     * Postgres bulk update
+     *
+     * @param array $worlds
+     * @return void
+     */
+    public static function update(array $worlds)
+    {
+        $rows = count($worlds);
+
+        if (!isset(self::$update[$rows])) {
+            $sql = 'UPDATE world SET randomNumber = CASE id'
+                . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) .
+                'END WHERE id IN ('
+                . implode(', ', array_fill(0, $rows, '?::INTEGER')) . ')';
+
+            self::$update[$rows] = self::$instance->prepare($sql);
+        }
+
+        $val = [];
+        $keys = [];
+        foreach ($worlds as $world) {
+            $val[] = $keys[] = $world['id'];
+            $val[] = $world['randomNumber'];
+        }
+
+        self::$update[$rows]->execute([...$val, ...$keys]);
+    }
+
+    /**
+     * Alternative bulk update in Postgres
+     *
+     * @param array $worlds
+     * @return void
+     */
+    public static function update2(array $worlds)
+    {
+        $rows = count($worlds);
+
+        if (!isset(self::$update[$rows])) {
+            $sql = 'UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES '
+                . implode(', ', array_fill(0, $rows, '(?::INTEGER, ?::INTEGER)')) .
+                ' ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id';
+
+            self::$update[$rows] = self::$instance->prepare($sql);
+        }
+
+        $val = [];
+        foreach ($worlds as $world) {
+            $val[] = $world['id'];
+            $val[] = $world['randomNumber'];
+            //$update->bindParam(++$i, $world['id'], PDO::PARAM_INT);
+        }
+
+        self::$update[$rows]->execute($val);
+    }
+}

+ 94 - 71
frameworks/PHP/kumbiaphp/benchmark_config.json

@@ -1,72 +1,95 @@
 {
-    "framework": "kumbiaphp",
-    "tests": [{
-        "default": {
-            "plaintext_url": "/",
-            "json_url": "/json",
-            "db_url": "/db",
-            "query_url": "/db/query/",
-            "fortune_url": "/fortune",
-            "update_url": "/db/update/",
-            "port": 8080,
-            "approach": "Realistic",
-            "classification": "Fullstack",
-            "database": "MySQL",
-            "framework": "KumbiaPHP",
-            "language": "PHP",
-            "flavor": "PHP7",
-            "orm": "micro",
-            "platform": "FPM/FastCGI",
-            "webserver": "nginx",
-            "os": "Linux",
-            "database_os": "Linux",
-            "display_name": "kumbiaphp",
-            "notes": "",
-            "versus": "php"
-        },
-        "raw": {
-            "db_url": "/raw",
-            "query_url": "/raw/query/",
-            "fortune_url": "/raw-fortune",
-            "update_url": "/raw/update/",
-            "port": 8080,
-            "approach": "Realistic",
-            "classification": "Fullstack",
-            "database": "MySQL",
-            "framework": "KumbiaPHP",
-            "language": "PHP",
-            "flavor": "PHP7",
-            "orm": "Raw",
-            "platform": "FPM/FastCGI",
-            "webserver": "nginx",
-            "os": "Linux",
-            "database_os": "Linux",
-            "display_name": "kumbiaphp-raw",
-            "notes": "",
-            "versus": "php"
-          },
-          "workerman-mysql": {
-            "plaintext_url": "/",
-            "json_url": "/json",
-            "db_url": "/db",
-            "query_url": "/db/query/",
-            "fortune_url": "/fortune",
-            "update_url": "/db/update/",
-            "port": 8080,
-            "approach": "Realistic",
-            "classification": "Fullstack",
-            "database": "MySQL",
-            "framework": "KumbiaPHP",
-            "language": "PHP",
-            "flavor": "PHP7",
-            "orm": "micro",
-            "platform": "workerman",
-            "webserver": "None",
-            "os": "Linux",
-            "database_os": "Linux",
-            "display_name": "kumbiaphp-worker",
-            "notes": "",
-            "versus": "workerman"
-          }
-        }]
-      }
+  "framework": "kumbiaphp",
+  "tests": [
+    {
+      "default": {
+        "plaintext_url": "/",
+        "json_url": "/json",
+        "db_url": "/db",
+        "query_url": "/db/query/",
+        "fortune_url": "/fortune",
+        "update_url": "/db/update/",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "KumbiaPHP",
+        "language": "PHP",
+        "flavor": "PHP7",
+        "orm": "micro",
+        "platform": "FPM/FastCGI",
+        "webserver": "nginx",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "kumbiaphp",
+        "notes": "",
+        "versus": "php"
+      },
+      "raw": {
+        "db_url": "/raw",
+        "query_url": "/raw/query/",
+        "fortune_url": "/raw-fortune",
+        "update_url": "/raw/update/",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "KumbiaPHP",
+        "language": "PHP",
+        "flavor": "PHP7",
+        "orm": "Raw",
+        "platform": "FPM/FastCGI",
+        "webserver": "nginx",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "kumbiaphp-raw",
+        "notes": "",
+        "versus": "php"
+      },
+      "workerman": {
+        "plaintext_url": "/",
+        "json_url": "/json",
+        "db_url": "/ku",
+        "query_url": "/ku/query/",
+        "update_url": "/ku/update/",
+        "fortune_url": "/ku-fortune",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "Postgres",
+        "framework": "KumbiaPHP",
+        "language": "PHP",
+        "flavor": "PHP7",
+        "orm": "raw",
+        "platform": "workerman",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "kumbiaphp-worker",
+        "notes": "",
+        "versus": "workerman"
+      },
+      "workerman-mysql": {
+        "db_url": "/db",
+        "query_url": "/db/query/",
+        "fortune_url": "/fortune",
+        "update_url": "/db/update/",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "KumbiaPHP",
+        "language": "PHP",
+        "flavor": "PHP7",
+        "orm": "micro",
+        "platform": "workerman",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "kumbiaphp-worker",
+        "notes": "",
+        "versus": "workerman"
+      }
+    }
+  ]
+}

+ 1 - 1
frameworks/PHP/kumbiaphp/deploy/conf/cliphp.ini

@@ -8,4 +8,4 @@ opcache.interned_strings_buffer=16
 opcache.huge_code_pages=1
 
 mysqlnd.collect_statistics = Off
-memory_limit = 768M
+memory_limit = 512M

+ 29 - 0
frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile

@@ -0,0 +1,29 @@
+FROM ubuntu:19.10
+
+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
+RUN apt-get update -yqq > /dev/null && \
+    apt-get install -yqq git unzip php7.4 php7.4-common php7.4-cli php7.4-pgsql  > /dev/null
+
+RUN apt-get install -yqq composer > /dev/null
+
+RUN apt-get install -y php-pear php-dev libevent-dev > /dev/null
+RUN printf "\n\n /usr/lib/x86_64-linux-gnu/\n\n\nno\n\n\n" | pecl install event > /dev/null && echo "extension=event.so" > /etc/php/7.4/cli/conf.d/event.ini
+
+COPY deploy/conf/cliphp.ini /etc/php/7.4/cli/php.ini
+
+ADD ./ /kumbiaphp
+WORKDIR /kumbiaphp
+
+RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia
+
+#RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/{index,json}_controller.php
+RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/index_controller.php
+RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/json_controller.php
+RUN sed -i "s|//KuRaw::init(|KuRaw::init(|g" server.php
+
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+
+CMD php server.php start

+ 2 - 1
frameworks/PHP/kumbiaphp/server.php

@@ -1,6 +1,6 @@
 <?php
-require_once __DIR__.'/bench/app/workerbootstrap.php';
 require_once __DIR__.'/vendor/autoload.php';
+require_once __DIR__.'/bench/app/workerbootstrap.php';
 
 use Workerman\Worker;
 
@@ -9,6 +9,7 @@ $http_worker->count         = (int) shell_exec('nproc') * 4;
 $http_worker->onWorkerStart = static function () {
 
     kumbiaInit();
+    //KuRaw::init();
 };
 
 $http_worker->onMessage = static function ($connection) {