Browse Source

Merge pull request #5088 from joanhey/worker-async

Workerman async MySQL
Mike Smith 5 years ago
parent
commit
b0efb5fef7

+ 20 - 1
frameworks/PHP/workerman/benchmark_config.json

@@ -41,7 +41,26 @@
       "webserver": "None",
       "webserver": "None",
       "os": "Linux",
       "os": "Linux",
       "database_os": "Linux",
       "database_os": "Linux",
-      "display_name": "workerman postgres",
+      "display_name": "workerman-postgres",
+      "notes": "",
+      "versus": "php"
+    },
+    "async": {
+      "db_url": "/db",
+      "fortune_url": "/fortune",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MySQL",
+      "framework": "None",
+      "language": "PHP",
+      "flavor": "PHP7",
+      "orm": "Raw",
+      "platform": "workerman",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "workerman-async-db",
       "notes": "",
       "notes": "",
       "versus": "php"
       "versus": "php"
     }
     }

+ 2 - 1
frameworks/PHP/workerman/composer.json

@@ -1,5 +1,6 @@
 {
 {
 	"require": {
 	"require": {
-		"workerman/workerman": "^3.5"
+		"workerman/workerman": "^3.5",
+		"react/mysql": "^0.3.3"
 	}
 	}
 }
 }

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

@@ -0,0 +1,81 @@
+<?php
+require_once __DIR__.'/vendor/autoload.php';
+
+use Workerman\Protocols\Http;
+use Workerman\Worker;
+
+$http_worker                = new Worker('http://0.0.0.0:8080');
+$http_worker->count         = shell_exec('nproc');
+$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) {
+
+    global $mysql;
+
+    Http::header('Date: '.gmdate('D, d M Y H:i:s').' GMT');
+
+    switch (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)) {
+        case '/db':
+            Http::header('Content-Type: application/json');
+            $mysql->query('SELECT id,randomNumber FROM World WHERE id='.mt_rand(1, 10000),
+                static function ($command) use ($connection) {
+                    $connection->send(json_encode($command->resultRows, JSON_NUMERIC_CHECK));
+                }
+            );
+            return;
+
+        case '/fortune':
+            Http::header('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($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();
+        //   $connection->send(ob_get_clean());
+
+        //default:
+        //   Http::header('HTTP', true, 404);
+        //   $connection->send('Error 404');
+    }
+};
+
+Worker::runAll();

+ 22 - 0
frameworks/PHP/workerman/workerman-async.dockerfile

@@ -0,0 +1,22 @@
+FROM ubuntu:19.04
+
+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 php7.3 php7.3-common php7.3-cli php7.3-mysql  > /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.3/cli/conf.d/event.ini
+
+COPY php.ini /etc/php/7.3/cli/php.ini
+
+ADD ./ /workerman
+WORKDIR /workerman
+
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+
+CMD php /workerman/server-async.php start