Răsfoiți Sursa

Workerman decouple app from server (#5493)

Joan Miquel 5 ani în urmă
părinte
comite
72473361ca

+ 65 - 7
frameworks/PHP/workerman/app.php

@@ -1,16 +1,73 @@
 <?php
+use Workerman\Protocols\Http;
+
+function init()
+{
+    global $statement, $fortune, $random, $update;
+    $pdo = new PDO('mysql:host=tfb-database;dbname=hello_world',
+        'benchmarkdbuser', 'benchmarkdbpass',
+        [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
+        PDO::ATTR_EMULATE_PREPARES    => false]
+    );
+    $statement = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
+    $fortune   = $pdo->prepare('SELECT id,message FROM Fortune');
+    $random    = $pdo->prepare('SELECT randomNumber FROM World WHERE id=?');
+    $update    = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?');
+}
+
+function router()
+{
+    switch (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)) {
+        case '/plaintext':
+            Http::header('Content-Type: text/plain');
+
+            return 'Hello, World!';
+
+        case '/json':
+            Http::header('Content-Type: application/json');
+
+            return json_encode(['message' => 'Hello, World!']);
+
+        case '/db':
+            return db();
+
+        case '/fortune':
+            // By default use 'Content-Type: text/html; charset=utf-8';
+            return fortune();
+
+        case '/query':
+            return query();
+
+        case '/update':
+            return updateraw();
+
+/*       case '/info':
+            Http::header('Content-Type: text/plain');
+            ob_start();
+            phpinfo();
+            return ob_get_clean();
+ */ 
+        default:
+            Http::responseCode(404);
+            return 'Error 404';
+    }
+}
+
 function db()
 {
     global $statement;
+    Http::header('Content-Type: application/json');
 
     $statement->execute([mt_rand(1, 10000)]);
-    return json_encode($statement->fetch(), JSON_NUMERIC_CHECK);
+
+    return json_encode($statement->fetch());
 }
 
 function query()
 {
     global $statement;
-    
+    Http::header('Content-Type: application/json');
+
     $query_count = 1;
     if ($_GET['q'] > 1) {
         $query_count = min($_GET['q'], 500);
@@ -21,12 +78,14 @@ function query()
         $arr[] = $statement->fetch();
     }
 
-    return json_encode($arr, JSON_NUMERIC_CHECK);
+    return json_encode($arr);
 }
 
 function updateraw()
 {
-    global $pdo, $random, $update;
+    global $random, $update;
+    Http::header('Content-Type: application/json');
+
     $query_count = 1;
     if ($_GET['q'] > 1) {
         $query_count = min($_GET['q'], 500);
@@ -42,21 +101,20 @@ function updateraw()
 
         $arr[] = $world;
     }
-    
+
     // $pdo->beginTransaction();
     // foreach($arr as $world) {
     //     $update->execute([$world['randomNumber'], $world['id']]);
     // }
     // $pdo->commit();
 
-    return json_encode($arr, JSON_NUMERIC_CHECK);
+    return json_encode($arr);
 }
 
 function fortune()
 {
     global $fortune;
 
-    //$fortune = $pdo->prepare('SELECT id,message FROM Fortune');
     $fortune->execute();
 
     $arr    = $fortune->fetchAll(PDO::FETCH_KEY_PAIR);

+ 3 - 45
frameworks/PHP/workerman/server.php

@@ -8,57 +8,15 @@ use Workerman\Worker;
 $http_worker                = new Worker('http://0.0.0.0:8080');
 $http_worker->count         = (int) shell_exec('nproc') * 4;
 $http_worker->onWorkerStart = function () {
-    global $pdo, $statement, $fortune, $random, $update;
-    $pdo = new PDO('mysql:host=tfb-database;dbname=hello_world',
-        'benchmarkdbuser', 'benchmarkdbpass',
-        [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
-        PDO::ATTR_EMULATE_PREPARES   => false]
-    );
-    $statement = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
-    $fortune   = $pdo->prepare('SELECT id,message FROM Fortune');
-    $random    = $pdo->prepare('SELECT randomNumber FROM World WHERE id=?');
-    $update    = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?');
+    init();
 };
 
 $http_worker->onMessage = static function ($connection) {
 
     Http::header('Date: '.gmdate('D, d M Y H:i:s').' GMT');
 
-    switch (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)) {
-        case '/plaintext':
-            Http::header('Content-Type: text/plain');
-            return $connection->send('Hello, World!');
-
-        case '/json':
-            Http::header('Content-Type: application/json');
-            return $connection->send(json_encode(['message' => 'Hello, World!']));
-
-        case '/db':
-            Http::header('Content-Type: application/json');
-            return $connection->send(db());
-
-        case '/fortune':
-            // By default use 'Content-Type: text/html; charset=utf-8';
-            return $connection->send(fortune());
-            
-        case '/query':
-            Http::header('Content-Type: application/json');
-            return $connection->send(query());
-
-        case '/update':
-            Http::header('Content-Type: application/json');
-            return $connection->send(updateraw());
-
-        //case '/info':
-        //   Http::header('Content-Type: text/plain');
-        //   ob_start();
-        //   phpinfo();
-        //   return $connection->send(ob_get_clean());
-
-        default:
-            Http::responseCode(404);
-            $connection->send('Error 404');
-    }
+    $connection->send(router());
+    
 };
 
 Worker::runAll();

+ 1 - 1
frameworks/PHP/workerman/workerman-pgsql.dockerfile

@@ -17,7 +17,7 @@ COPY php.ini /etc/php/7.4/cli/php.ini
 ADD ./ /workerman
 WORKDIR /workerman
 
-RUN sed -i "s|PDO('mysql:|PDO('pgsql:|g" server.php
+RUN sed -i "s|PDO('mysql:|PDO('pgsql:|g" app.php
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet