Browse Source

Re-enabling Swoole / Coroutine / MySQL (#5235)

vka 5 years ago
parent
commit
f3c16dde66

+ 25 - 46
frameworks/PHP/hamlet/Benchmark/Application.php

@@ -2,54 +2,28 @@
 
 
 namespace Benchmark;
 namespace Benchmark;
 
 
-use Benchmark\Resources\DbResource;
-use Benchmark\Resources\FortuneResource;
-use Benchmark\Resources\HelloJsonResource;
-use Benchmark\Resources\HelloTextResource;
-use Benchmark\Resources\QueriesResource;
-use Benchmark\Resources\UpdateResource;
+use Benchmark\Resources\{DbResource, FortuneResource, HelloJsonResource, HelloTextResource, QueriesResource, UpdateResource};
 use Cache\Adapter\PHPArray\ArrayCachePool;
 use Cache\Adapter\PHPArray\ArrayCachePool;
-use Hamlet\Database\Database;
+use Hamlet\Database\{Database, Session};
 use Hamlet\Http\Applications\AbstractApplication;
 use Hamlet\Http\Applications\AbstractApplication;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Resources\HttpResource;
-use Hamlet\Http\Resources\NotFoundResource;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\ServerErrorResponse;
+use Hamlet\Http\Resources\{HttpResource, NotFoundResource};
+use Hamlet\Http\Responses\{Response, ServerErrorResponse};
 use Psr\Cache\CacheItemPoolInterface;
 use Psr\Cache\CacheItemPoolInterface;
 use Throwable;
 use Throwable;
 
 
 class Application extends AbstractApplication
 class Application extends AbstractApplication
 {
 {
-    /** @var CacheItemPoolInterface|null */
+    /** @var CacheItemPoolInterface */
     private $cache;
     private $cache;
 
 
-    /** @var HttpResource */
-    private $helloTextResource;
-
-    /** @var HttpResource */
-    private $helloJsonResource;
-
-    /** @var HttpResource */
-    private $dbResource;
-
-    /** @var HttpResource */
-    private $queriesResource;
-
-    /** @var HttpResource */
-    private $fortuneResource;
-
-    /** @var HttpResource */
-    private $updateResource;
+    /** @var Database */
+    private $database;
 
 
     public function __construct(Database $database)
     public function __construct(Database $database)
     {
     {
-        $this->helloJsonResource = new HelloJsonResource();
-        $this->helloTextResource = new HelloTextResource();
-        $this->dbResource        = new DbResource($database);
-        $this->queriesResource   = new QueriesResource($database);
-        $this->fortuneResource   = new FortuneResource($database);
-        $this->updateResource    = new UpdateResource($database);
+        $this->cache = new ArrayCachePool;
+        $this->database = $database;
     }
     }
 
 
     public function run(Request $request): Response
     public function run(Request $request): Response
@@ -57,7 +31,7 @@ class Application extends AbstractApplication
         try {
         try {
             return parent::run($request);
             return parent::run($request);
         } catch (Throwable $e) {
         } catch (Throwable $e) {
-            return new ServerErrorResponse();
+            return new ServerErrorResponse;
         }
         }
     }
     }
 
 
@@ -65,26 +39,31 @@ class Application extends AbstractApplication
     {
     {
         switch ($request->getPath()) {
         switch ($request->getPath()) {
             case '/plaintext':
             case '/plaintext':
-                return $this->helloTextResource;
+                return new HelloTextResource;
             case '/json':
             case '/json':
-                return $this->helloJsonResource;
+                return new HelloJsonResource;
             case '/db':
             case '/db':
-                return $this->dbResource;
+                return $this->database->withSession(function (Session $session) {
+                    return new DbResource($session);
+                });
             case '/queries':
             case '/queries':
-                return $this->queriesResource;
+                return $this->database->withSession(function (Session $session) {
+                    return new QueriesResource($session);
+                });
             case '/fortunes':
             case '/fortunes':
-                return $this->fortuneResource;
+                return $this->database->withSession(function (Session $session) {
+                    return new FortuneResource($session);
+                });
             case '/update':
             case '/update':
-                return $this->updateResource;
+                return $this->database->withSession(function (Session $session) {
+                    return new UpdateResource($session);
+                });
         }
         }
-        return new NotFoundResource();
+        return new NotFoundResource;
     }
     }
 
 
     protected function getCache(Request $request): CacheItemPoolInterface
     protected function getCache(Request $request): CacheItemPoolInterface
     {
     {
-        if (!$this->cache) {
-            $this->cache = new ArrayCachePool();
-        }
         return $this->cache;
         return $this->cache;
     }
     }
 }
 }

+ 5 - 29
frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php

@@ -3,33 +3,25 @@
 namespace Benchmark\Resources;
 namespace Benchmark\Resources;
 
 
 use Benchmark\Entities\RandomNumber;
 use Benchmark\Entities\RandomNumber;
-use Hamlet\Database\Database;
-use Hamlet\Database\Procedure;
+use Hamlet\Database\{Procedure, Session};
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Resources\HttpResource;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
-use function Hamlet\Cast\_int;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
 class DbResource implements HttpResource
 class DbResource implements HttpResource
 {
 {
-    /** @var Database */
-    protected $database;
-
     /** @var Procedure */
     /** @var Procedure */
     private $procedure;
     private $procedure;
 
 
-    public function __construct(Database $database)
+    public function __construct(Session $session)
     {
     {
-        $this->database = $database;
-        $query = '
+        $this->procedure = $session->prepare('
             SELECT id,
             SELECT id,
                    randomNumber 
                    randomNumber 
               FROM World 
               FROM World 
              WHERE id = ?
              WHERE id = ?
-        ';
-        $this->procedure = $this->database->prepare($query);
+        ');
     }
     }
 
 
     public function getResponse(Request $request): Response
     public function getResponse(Request $request): Response
@@ -41,20 +33,4 @@ class DbResource implements HttpResource
             ->collectHead();
             ->collectHead();
         return new SimpleOKResponse(new JsonEntity($record));
         return new SimpleOKResponse(new JsonEntity($record));
     }
     }
-
-    protected function getQueriesCount(Request $request): int
-    {
-        if ($request->hasQueryParam('queries')) {
-            $count = $request->getQueryParam('queries', _int());
-            if ($count < 1) {
-                return 1;
-            } elseif (500 < $count) {
-                return 500;
-            } else {
-                return $count;
-            }
-        } else {
-            return 1;
-        }
-    }
 }
 }

+ 6 - 8
frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php

@@ -4,26 +4,24 @@ namespace Benchmark\Resources;
 
 
 use Benchmark\Entities\FortuneEntity;
 use Benchmark\Entities\FortuneEntity;
 use Benchmark\Entities\Message;
 use Benchmark\Entities\Message;
-use Hamlet\Database\Database;
-use Hamlet\Database\Procedure;
+use Hamlet\Database\{Procedure, Session};
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
+use Hamlet\Http\Resources\HttpResource;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
-class FortuneResource extends DbResource
+class FortuneResource implements HttpResource
 {
 {
     /** @var Procedure */
     /** @var Procedure */
     private $procedure;
     private $procedure;
 
 
-    public function __construct(Database $database)
+    public function __construct(Session $session)
     {
     {
-        parent::__construct($database);
         $query = '
         $query = '
             SELECT id,
             SELECT id,
                    message
                    message
               FROM Fortune
               FROM Fortune
         ';
         ';
-        $this->procedure = $this->database->prepare($query);
+        $this->procedure = $session->prepare($query);
     }
     }
 
 
     public function getResponse(Request $request): Response
     public function getResponse(Request $request): Response

+ 1 - 2
frameworks/PHP/hamlet/Benchmark/Resources/HelloJsonResource.php

@@ -5,8 +5,7 @@ namespace Benchmark\Resources;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Resources\HttpResource;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
 class HelloJsonResource implements HttpResource
 class HelloJsonResource implements HttpResource
 {
 {

+ 1 - 2
frameworks/PHP/hamlet/Benchmark/Resources/HelloTextResource.php

@@ -5,8 +5,7 @@ namespace Benchmark\Resources;
 use Hamlet\Http\Entities\PlainTextEntity;
 use Hamlet\Http\Entities\PlainTextEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Resources\HttpResource;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
 class HelloTextResource implements HttpResource
 class HelloTextResource implements HttpResource
 {
 {

+ 25 - 0
frameworks/PHP/hamlet/Benchmark/Resources/QueriesCountTrait.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace Benchmark\Resources;
+
+use Hamlet\Http\Requests\Request;
+use function Hamlet\Cast\_int;
+
+trait QueriesCountTrait
+{
+    protected function getQueriesCount(Request $request): int
+    {
+        if ($request->hasQueryParam('queries')) {
+            $count = $request->getQueryParam('queries', _int());
+            if ($count < 1) {
+                return 1;
+            } elseif (500 < $count) {
+                return 500;
+            } else {
+                return $count;
+            }
+        } else {
+            return 1;
+        }
+    }
+}

+ 9 - 10
frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php

@@ -3,28 +3,27 @@
 namespace Benchmark\Resources;
 namespace Benchmark\Resources;
 
 
 use Benchmark\Entities\RandomNumber;
 use Benchmark\Entities\RandomNumber;
-use Hamlet\Database\Database;
-use Hamlet\Database\Procedure;
+use Hamlet\Database\{Procedure, Session};
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
+use Hamlet\Http\Resources\HttpResource;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
-class QueriesResource extends DbResource
+class QueriesResource implements HttpResource
 {
 {
+    use QueriesCountTrait;
+
     /** @var Procedure */
     /** @var Procedure */
     private $procedure;
     private $procedure;
 
 
-    public function __construct(Database $database)
+    public function __construct(Session $session)
     {
     {
-        parent::__construct($database);
-        $query = '
+        $this->procedure = $session->prepare('
             SELECT id,
             SELECT id,
                    randomNumber 
                    randomNumber 
               FROM World 
               FROM World 
              WHERE id = ?
              WHERE id = ?
-        ';
-        $this->procedure = $this->database->prepare($query);
+        ');
     }
     }
 
 
     public function getResponse(Request $request): Response
     public function getResponse(Request $request): Response

+ 12 - 14
frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php

@@ -3,37 +3,35 @@
 namespace Benchmark\Resources;
 namespace Benchmark\Resources;
 
 
 use Benchmark\Entities\RandomNumber;
 use Benchmark\Entities\RandomNumber;
-use Hamlet\Database\Database;
-use Hamlet\Database\Procedure;
+use Hamlet\Database\{Procedure, Session};
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Responses\Response;
-use Hamlet\Http\Responses\SimpleOKResponse;
+use Hamlet\Http\Resources\HttpResource;
+use Hamlet\Http\Responses\{Response, SimpleOKResponse};
 
 
-class UpdateResource extends DbResource
+class UpdateResource implements HttpResource
 {
 {
+    use QueriesCountTrait;
+
     /** @var Procedure */
     /** @var Procedure */
     private $selectProcedure;
     private $selectProcedure;
 
 
     /** @var Procedure */
     /** @var Procedure */
     private $updateProcedure;
     private $updateProcedure;
 
 
-    public function __construct(Database $database)
+    public function __construct(Session $session)
     {
     {
-        parent::__construct($database);
-        $selectQuery = '
+        $this->selectProcedure = $session->prepare('
             SELECT id,
             SELECT id,
                    randomNumber 
                    randomNumber 
               FROM World
               FROM World
              WHERE id = ?
              WHERE id = ?
-        ';
-        $this->selectProcedure = $this->database->prepare($selectQuery);
-        $updateQuery = '
-            UPDATE World 
+        ');
+        $this->updateProcedure = $session->prepare('
+            UPDATE World
                SET randomNumber = ? 
                SET randomNumber = ? 
              WHERE id = ?
              WHERE id = ?
-        ';
-        $this->updateProcedure = $this->database->prepare($updateQuery);
+        ');
     }
     }
 
 
     public function getResponse(Request $request): Response
     public function getResponse(Request $request): Response

+ 1 - 1
frameworks/PHP/hamlet/hamlet-swoole.dockerfile

@@ -19,7 +19,7 @@ WORKDIR /php
 RUN chmod -R 777 /php
 RUN chmod -R 777 /php
 
 
 RUN composer require hamlet-framework/http-swoole:dev-master --quiet
 RUN composer require hamlet-framework/http-swoole:dev-master --quiet
-RUN composer require hamlet-framework/db-pdo:dev-master --quiet
+RUN composer require hamlet-framework/db-mysql-swoole:dev-master --quiet
 RUN composer update --no-dev --quiet
 RUN composer update --no-dev --quiet
 
 
 CMD php /php/swoole.php
 CMD php /php/swoole.php

+ 7 - 5
frameworks/PHP/hamlet/swoole.php

@@ -1,15 +1,17 @@
 <?php
 <?php
 
 
 use Benchmark\Application;
 use Benchmark\Application;
-use Hamlet\Database\PDO\PDODatabase;
+use Hamlet\Database\MySQLSwoole\MySQLSwooleDatabase;
 use Hamlet\Http\Swoole\Bootstraps\SwooleBootstrap;
 use Hamlet\Http\Swoole\Bootstraps\SwooleBootstrap;
 
 
 require_once __DIR__ . '/vendor/autoload.php';
 require_once __DIR__ . '/vendor/autoload.php';
 
 
-$database = new PDODatabase(
-    'mysql:host=tfb-database;dbname=hello_world',
+$database = new MySQLSwooleDatabase(
+    'tfb-database',
     'benchmarkdbuser',
     'benchmarkdbuser',
-    'benchmarkdbpass'
+    'benchmarkdbpass',
+    'hello_world',
+    intdiv(512, swoole_cpu_num())
 );
 );
 $application = new Application($database);
 $application = new Application($database);
-SwooleBootstrap::run('0.0.0.0', 8080, $application);
+SwooleBootstrap::run('0.0.0.0', 8080, $application, $database);