Kaynağa Gözat

Add imi-query-builder and imi-raw (#5304)

* Add imi-query-builder and imi-raw

* fix name

* Add fortunesRaw

* fix update
Yurun 5 yıl önce
ebeveyn
işleme
68b23aaee7

+ 167 - 3
frameworks/PHP/imi/ApiServer/Controller/IndexController.php

@@ -4,10 +4,12 @@ namespace ImiApp\ApiServer\Controller;
 use ImiApp\Model\World;
 use ImiApp\Model\Fortune;
 use Imi\Controller\HttpController;
+use Imi\Db\Db;
 use Imi\RequestContext;
 use Imi\Server\View\Annotation\View;
 use Imi\Server\Route\Annotation\Action;
 use Imi\Server\Route\Annotation\Controller;
+use Imi\Util\Stream\MemoryStream;
 
 /**
  * @Controller("/")
@@ -40,7 +42,7 @@ class IndexController extends HttpController
      *
      * @return void
      */
-    public function db()
+    public function dbModel()
     {
         return World::find(mt_rand(1, 10000));
     }
@@ -50,7 +52,30 @@ class IndexController extends HttpController
      *
      * @return void
      */
-    public function query($queries)
+    public function dbQueryBuilder()
+    {
+        return Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', mt_rand(1, 10000))->select()->get();
+    }
+
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function dbRaw()
+    {
+        $db = Db::getInstance();
+        $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
+        $stmt->execute([mt_rand(1, 10000)]);
+        return $stmt->fetch();
+    }
+
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function queryModel($queries)
     {
         if($queries > 1)
         {
@@ -68,6 +93,55 @@ class IndexController extends HttpController
         return $list;
     }
 
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function queryQueryBuilder($queries)
+    {
+        if($queries > 1)
+        {
+            $queryCount = min($queries, 500);
+        }
+        else
+        {
+            $queryCount = 1;
+        }
+        $list = [];
+        while ($queryCount--)
+        {
+            $list[] = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', mt_rand(1, 10000))->select()->get();
+        }
+        return $list;
+    }
+
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function queryRaw($queries)
+    {
+        if($queries > 1)
+        {
+            $queryCount = min($queries, 500);
+        }
+        else
+        {
+            $queryCount = 1;
+        }
+        $list = [];
+        $db = Db::getInstance();
+        $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
+        while ($queryCount--)
+        {
+            $stmt->execute([mt_rand(1, 10000)]);
+            $list[] = $stmt->fetch();
+        }
+        return $list;
+    }
+
     /**
      * @Action
      * @View(renderType="html")
@@ -92,12 +166,39 @@ class IndexController extends HttpController
         ];
     }
 
+    /**
+     * @Action
+     * @View(renderType="html")
+     *
+     * @return void
+     */
+    public function fortunesRaw()
+    {
+        $rows = [];
+        foreach(Db::getInstance()->query('SELECT id, message FROM Fortune')->fetchAll() as $item)
+        {
+            $rows[$item['id']] = $item['message'];
+        }
+        $rows[0] = 'Additional fortune added at request time.';
+        asort($rows);
+
+        $html = '';
+        foreach ($rows as $id => $message)
+        {
+            $message = \htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
+            $html .= "<tr><td>{$id}</td><td>{$message}</td></tr>";
+        }
+
+        return RequestContext::get('response')->withHeader('Content-Type', 'text/html; charset=UTF-8')
+                                              ->withBody(new MemoryStream("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>{$html}</table></body></html>"));
+    }
+
     /**
      * @Action
      *
      * @return void
      */
-    public function update($queries)
+    public function updateModel($queries)
     {
         if($queries > 1)
         {
@@ -117,4 +218,67 @@ class IndexController extends HttpController
         return $list;
     }
 
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function updateQueryBuilder($queries)
+    {
+        if($queries > 1)
+        {
+            $queryCount = min($queries, 500);
+        }
+        else
+        {
+            $queryCount = 1;
+        }
+        $list = [];
+        while ($queryCount--)
+        {
+            $id = mt_rand(1, 10000);
+            $row = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', $id)->select()->get();
+            $row['randomNumber'] = mt_rand(1, 10000);
+            Db::query()->from('World')->where('id', '=', $row['id'])->update([
+                'randomNumber'  =>  $row['randomNumber'],
+            ]);
+            $list[] = $row;
+        }
+        return $list;
+    }
+
+    /**
+     * @Action
+     *
+     * @return void
+     */
+    public function updateRaw($queries)
+    {
+        if($queries > 1)
+        {
+            $queryCount = min($queries, 500);
+        }
+        else
+        {
+            $queryCount = 1;
+        }
+        $list = [];
+        $db = Db::getInstance();
+        $stmtSelect = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
+        $stmtUpdate = $db->prepare('UPDATE World SET randomNumber = :randomNumber WHERE id = :id');
+        while ($queryCount--)
+        {
+            $id = mt_rand(1, 10000);
+            $stmtSelect->execute([$id]);
+            $row = $stmtSelect->fetch();
+            $row['randomNumber'] = mt_rand(1, 10000);
+            $stmtUpdate->execute([
+                'id'            =>  $row['id'],
+                'randomNumber'  =>  $row['randomNumber'],
+            ]);
+            $list[] = $row;
+        }
+        return $list;
+    }
+
 }

+ 44 - 3
frameworks/PHP/imi/benchmark_config.json

@@ -5,10 +5,10 @@
       "default": {
         "json_url": "/json",
         "plaintext_url": "/plaintext",
-        "db_url": "/db",
-        "query_url": "/query?queries=",
+        "db_url": "/dbModel",
+        "query_url": "/queryModel?queries=",
         "fortune_url": "/fortunes",
-        "update_url": "/update?queries=",
+        "update_url": "/updateModel?queries=",
         "port": 8080,
         "approach": "Realistic",
         "classification": "Fullstack",
@@ -24,6 +24,47 @@
         "display_name": "imi",
         "notes": "",
         "versus": "Swoole"
+      },
+      "query-builder": {
+        "db_url": "/dbQueryBuilder",
+        "query_url": "/queryQueryBuilder?queries=",
+        "update_url": "/updateQueryBuilder?queries=",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "imi",
+        "language": "PHP",
+        "flavor": "None",
+        "orm": "Micro",
+        "platform": "Swoole",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "imi-query-builder",
+        "notes": "",
+        "versus": "Swoole"
+      },
+      "raw": {
+        "db_url": "/dbRaw",
+        "query_url": "/queryRaw?queries=",
+        "update_url": "/updateRaw?queries=",
+        "fortune_url": "/fortunesRaw",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "MySQL",
+        "framework": "imi",
+        "language": "PHP",
+        "flavor": "None",
+        "orm": "Raw",
+        "platform": "Swoole",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "imi-raw",
+        "notes": "",
+        "versus": "Swoole"
       }
     }
   ]

+ 22 - 0
frameworks/PHP/imi/imi-query-builder.dockerfile

@@ -0,0 +1,22 @@
+FROM php:7.4
+
+RUN pecl install swoole > /dev/null && \
+    docker-php-ext-enable swoole
+
+RUN docker-php-ext-install pdo_mysql > /dev/null
+
+RUN apt -yqq update > /dev/null && \
+    apt -yqq install git unzip > /dev/null
+
+WORKDIR /imi
+
+COPY . /imi
+COPY php.ini /usr/local/etc/php/
+
+RUN chmod -R ug+rwx /imi/.runtime
+
+RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null
+RUN composer dumpautoload -o
+
+CMD php vendor/bin/imi server/start

+ 22 - 0
frameworks/PHP/imi/imi-raw.dockerfile

@@ -0,0 +1,22 @@
+FROM php:7.4
+
+RUN pecl install swoole > /dev/null && \
+    docker-php-ext-enable swoole
+
+RUN docker-php-ext-install pdo_mysql > /dev/null
+
+RUN apt -yqq update > /dev/null && \
+    apt -yqq install git unzip > /dev/null
+
+WORKDIR /imi
+
+COPY . /imi
+COPY php.ini /usr/local/etc/php/
+
+RUN chmod -R ug+rwx /imi/.runtime
+
+RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null
+RUN composer dumpautoload -o
+
+CMD php vendor/bin/imi server/start