Browse Source

Removing PeachPie, clean up, cacheing resources (#4757)

* Updating Hamlet framework, using entities instead of raw ORM, removing roadrunner, react and amp.

* adding missing template file

* updates

* using type safe parser for query params

* removing peachpie

* Updating Hamlet framework, using entities instead of raw ORM, removing roadrunner, react and amp.

* updates

* using type safe parser for query params

* removing peachpie

* using ubuntu instead of debian, pre-initializing resources

* storing prepared queries in the constructor

* compare hamlet-swoole to swoole for framework overhead
vka 6 năm trước cách đây
mục cha
commit
f38cfc86c2

+ 30 - 9
frameworks/PHP/hamlet/Benchmark/Application.php

@@ -21,28 +21,49 @@ class Application extends AbstractApplication
     /** @var CacheItemPoolInterface|null */
     private $cache;
 
-    /** @var Database */
-    private $database;
+    /** @var HttpResource */
+    private $helloTextResource;
+
+    /** @var HttpResource */
+    private $helloJsonResource;
+
+    /** @var HttpResource */
+    private $dbResource;
+
+    /** @var HttpResource */
+    private $queriesResource;
+
+    /** @var HttpResource */
+    private $fortuneResource;
+
+    /** @var HttpResource */
+    private $updateResource;
 
     public function __construct(Database $database)
     {
-        $this->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);
     }
+
     public function findResource(Request $request): HttpResource
     {
         switch ($request->getPath()) {
             case '/plaintext':
-                return new HelloTextResource();
+                return $this->helloTextResource;
             case '/json':
-                return new HelloJsonResource();
+                return $this->helloJsonResource;
             case '/db':
-                return new DbResource($this->database);
+                return $this->dbResource;
             case '/queries':
-                return new QueriesResource($this->database);
+                return $this->queriesResource;
             case '/fortunes':
-                return new FortuneResource($this->database);
+                return $this->fortuneResource;
             case '/update':
-                return new UpdateResource($this->database);
+                return $this->updateResource;
         }
         return new NotFoundResource();
     }

+ 32 - 9
frameworks/PHP/hamlet/Benchmark/Resources/DbResource.php

@@ -4,34 +4,57 @@ namespace Benchmark\Resources;
 
 use Benchmark\Entities\RandomNumber;
 use Hamlet\Database\Database;
+use Hamlet\Database\Procedure;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
 use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Responses\Response;
 use Hamlet\Http\Responses\SimpleOKResponse;
+use function Hamlet\Cast\_int;
 
 class DbResource implements HttpResource
 {
-    private $database;
+    /** @var Database */
+    protected $database;
+
+    /** @var Procedure */
+    private $procedure;
 
     public function __construct(Database $database)
     {
         $this->database = $database;
-    }
-
-    public function getResponse(Request $request): Response
-    {
-        $id = mt_rand(1, 10000);
         $query = '
             SELECT id,
                    randomNumber 
               FROM World 
              WHERE id = ?
         ';
-        $procedure = $this->database->prepare($query);
-        $procedure->bindInteger($id);
-        $record = $procedure->processOne()->selectAll()->cast(RandomNumber::class)->collectHead();
+        $this->procedure = $this->database->prepare($query);
+    }
 
+    public function getResponse(Request $request): Response
+    {
+        $id = mt_rand(1, 10000);
+        $this->procedure->bindInteger($id);
+        $record = $this->procedure->processOne()
+            ->selectAll()->cast(RandomNumber::class)
+            ->collectHead();
         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;
+        }
+    }
 }

+ 14 - 10
frameworks/PHP/hamlet/Benchmark/Resources/FortuneResource.php

@@ -5,29 +5,33 @@ namespace Benchmark\Resources;
 use Benchmark\Entities\FortuneEntity;
 use Benchmark\Entities\Message;
 use Hamlet\Database\Database;
+use Hamlet\Database\Procedure;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Responses\Response;
 use Hamlet\Http\Responses\SimpleOKResponse;
 
-class FortuneResource implements HttpResource
+class FortuneResource extends DbResource
 {
-    private $database;
+    /** @var Procedure */
+    private $procedure;
 
     public function __construct(Database $database)
     {
-        $this->database = $database;
-    }
-
-    public function getResponse(Request $request): Response
-    {
+        parent::__construct($database);
         $query = '
             SELECT id,
                    message
               FROM Fortune
         ';
-        $procedure = $this->database->prepare($query);
-        $messages = $procedure->processAll()->selectAll()->cast(Message::class)->collectAll();
+        $this->procedure = $this->database->prepare($query);
+    }
+
+    public function getResponse(Request $request): Response
+    {
+        $messages = $this->procedure->processAll()
+            ->selectAll()->cast(Message::class)
+            ->collectAll();
+
         $messages[] = new Message(0, 'Additional fortune added at request time.');
         usort($messages, function (Message $a, Message $b): int {
             return $a->message() <=> $b->message();

+ 15 - 18
frameworks/PHP/hamlet/Benchmark/Resources/QueriesResource.php

@@ -4,43 +4,40 @@ namespace Benchmark\Resources;
 
 use Benchmark\Entities\RandomNumber;
 use Hamlet\Database\Database;
+use Hamlet\Database\Procedure;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Responses\Response;
 use Hamlet\Http\Responses\SimpleOKResponse;
 
-class QueriesResource implements HttpResource
+class QueriesResource extends DbResource
 {
-    private $database;
+    /** @var Procedure */
+    private $procedure;
 
     public function __construct(Database $database)
     {
-        $this->database = $database;
-    }
-
-    public function getResponse(Request $request): Response
-    {
-        $count = $request->parameter('queries');
-        if ($count === null || $count < 1) {
-            $count = 1;
-        } else {
-            $count = min($count, 500);
-        }
-
+        parent::__construct($database);
         $query = '
             SELECT id,
                    randomNumber 
               FROM World 
              WHERE id = ?
         ';
-        $procedure = $this->database->prepare($query);
+        $this->procedure = $this->database->prepare($query);
+    }
+
+    public function getResponse(Request $request): Response
+    {
+        $count = $this->getQueriesCount($request);
 
         $payload = [];
         while ($count-- > 0) {
             $id = mt_rand(1, 10000);
-            $procedure->bindInteger($id);
-            $payload[] = $procedure->processOne()->selectAll()->cast(RandomNumber::class)->collectHead();
+            $this->procedure->bindInteger($id);
+            $payload[] = $this->procedure->processOne()
+                ->selectAll()->cast(RandomNumber::class)
+                ->collectHead();
         }
 
         return new SimpleOKResponse(new JsonEntity($payload));

+ 22 - 24
frameworks/PHP/hamlet/Benchmark/Resources/UpdateResource.php

@@ -4,59 +4,57 @@ namespace Benchmark\Resources;
 
 use Benchmark\Entities\RandomNumber;
 use Hamlet\Database\Database;
+use Hamlet\Database\Procedure;
 use Hamlet\Http\Entities\JsonEntity;
 use Hamlet\Http\Requests\Request;
-use Hamlet\Http\Resources\HttpResource;
 use Hamlet\Http\Responses\Response;
 use Hamlet\Http\Responses\SimpleOKResponse;
 
-class UpdateResource implements HttpResource
+class UpdateResource extends DbResource
 {
-    private $database;
+    /** @var Procedure */
+    private $selectProcedure;
 
-    public function __construct(Database $database)
-    {
-        $this->database = $database;
-    }
+    /** @var Procedure */
+    private $updateProcedure;
 
-    public function getResponse(Request $request): Response
+    public function __construct(Database $database)
     {
-        $count = $request->parameter('queries');
-        if ($count !== null && $count > 0) {
-            $count = min($count, 500);
-        } else {
-            $count = 1;
-        }
-
+        parent::__construct($database);
         $selectQuery = '
             SELECT id,
                    randomNumber 
               FROM World
              WHERE id = ?
         ';
-        $selectProcedure = $this->database->prepare($selectQuery);
-
+        $this->selectProcedure = $this->database->prepare($selectQuery);
         $updateQuery = '
             UPDATE World 
                SET randomNumber = ? 
              WHERE id = ?
         ';
-        $updateProcedure = $this->database->prepare($updateQuery);
+        $this->updateProcedure = $this->database->prepare($updateQuery);
+    }
+
+    public function getResponse(Request $request): Response
+    {
+        $count = $this->getQueriesCount($request);
 
         $payload = [];
         while ($count-- > 0) {
             $id = mt_rand(1, 10000);
             $randomNumber = mt_rand(1, 10000);
 
-            $selectProcedure->bindInteger($id);
+            $this->selectProcedure->bindInteger($id);
             /** @var RandomNumber $entry */
-            $entry = $selectProcedure->processOne()->selectAll()->cast(RandomNumber::class)->collectHead();
-
+            $entry = $this->selectProcedure->processOne()
+                ->selectAll()->cast(RandomNumber::class)
+                ->collectHead();
             $modifiedEntry = $entry->withNumber($randomNumber);
 
-            $updateProcedure->bindInteger($modifiedEntry->number());
-            $updateProcedure->bindInteger($modifiedEntry->id());
-            $updateProcedure->execute();
+            $this->updateProcedure->bindInteger($modifiedEntry->number());
+            $this->updateProcedure->bindInteger($modifiedEntry->id());
+            $this->updateProcedure->execute();
 
             $payload[] = $modifiedEntry;
         }

+ 0 - 1
frameworks/PHP/hamlet/README.md

@@ -6,7 +6,6 @@ Current submission tests the following configurations:
 
 - Hamlet
 - Hamlet + Swoole
-- Hamlet + PeachPie
 
 ## (Some) Documentation
 

+ 0 - 12
frameworks/PHP/hamlet/Website.msbuildproj

@@ -1,12 +0,0 @@
-<Project Sdk="Peachpie.NET.Sdk/0.9.40">
-  <PropertyGroup>
-    <OutputType>Library</OutputType>
-    <TargetFramework>netstandard2.0</TargetFramework>
-    <AssemblyName>Website</AssemblyName>
-  </PropertyGroup>
-  <ItemGroup>
-    <Compile
-        Include="index.php;Benchmark/**/*.php;vendor/**/*.php;"
-        Exclude="**/phpunit/**;**/tests/**;**/*Test.php;**/*TestCase.php"/>
-  </ItemGroup>
-</Project>

+ 2 - 20
frameworks/PHP/hamlet/benchmark_config.json

@@ -25,6 +25,7 @@
       "versus": "php"
     },
     "swoole": {
+      "plaintext_url": "/plaintext",
       "json_url": "/json",
       "db_url": "/db",
       "query_url": "/queries?queries=",
@@ -44,26 +45,7 @@
       "database_os": "Linux",
       "display_name": "hamlet-swoole",
       "notes": "",
-      "versus": "php"
-    },
-    "peachpie": {
-      "plaintext_url": "/plaintext",
-      "json_url": "/json",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Fullstack",
-      "database": "mysql",
-      "framework": "hamlet",
-      "language": "PHP",
-      "flavor": "PHP7",
-      "orm": "micro",
-      "platform": ".NET",
-      "webserver": "kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "hamlet-peachpie",
-      "notes": "",
-      "versus": "php"
+      "versus": "swoole"
     }
   }]
 }

+ 0 - 3
frameworks/PHP/hamlet/deploy/peachpie/.gitignore

@@ -1,3 +0,0 @@
-.idea/
-*/bin/
-*/obj/

+ 0 - 48
frameworks/PHP/hamlet/deploy/peachpie/Benchmarks.sln

@@ -1,48 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26124.0
-MinimumVisualStudioVersion = 15.0.26124.0
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Website", "../../Website.msbuildproj", "{A271793F-72BF-429D-9EC8-83C03559CBD6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server/Server.csproj", "{AF5D53C1-32B5-473F-9229-817608068701}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Debug|x64 = Debug|x64
-		Debug|x86 = Debug|x86
-		Release|Any CPU = Release|Any CPU
-		Release|x64 = Release|x64
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|x64.ActiveCfg = Debug|x64
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|x64.Build.0 = Debug|x64
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|x86.ActiveCfg = Debug|x86
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Debug|x86.Build.0 = Debug|x86
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|x64.ActiveCfg = Release|x64
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|x64.Build.0 = Release|x64
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|x86.ActiveCfg = Release|x86
-		{A271793F-72BF-429D-9EC8-83C03559CBD6}.Release|x86.Build.0 = Release|x86
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|x64.ActiveCfg = Debug|x64
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|x64.Build.0 = Debug|x64
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|x86.ActiveCfg = Debug|x86
-		{AF5D53C1-32B5-473F-9229-817608068701}.Debug|x86.Build.0 = Debug|x86
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|Any CPU.Build.0 = Release|Any CPU
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|x64.ActiveCfg = Release|x64
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|x64.Build.0 = Release|x64
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|x86.ActiveCfg = Release|x86
-		{AF5D53C1-32B5-473F-9229-817608068701}.Release|x86.Build.0 = Release|x86
-	EndGlobalSection
-EndGlobal

+ 0 - 46
frameworks/PHP/hamlet/deploy/peachpie/Server/Program.cs

@@ -1,46 +0,0 @@
-using System.IO;
-using System.Threading;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Rewrite;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Peachpie.AspNetCore.Web;
-
-namespace Server
-{
-    class Program
-    {
-        static void Main(string[] args)
-        {
-            ThreadPool.GetMinThreads(out int workerThread, out int completionThread);
-            ThreadPool.SetMinThreads(workerThread * 2, completionThread);
-
-            var host = new WebHostBuilder()
-                .UseKestrel()
-                .UseUrls("http://0.0.0.0:8080")
-                .UseStartup<Startup>()
-                .Build();
-
-            host.Run();
-        }
-    }
-
-    class Startup
-    {
-        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
-        {
-            // loggerFactory.AddConsole();
-
-            app.UseRewriter(new RewriteOptions().Add(ShortUrlRule));
-            void ShortUrlRule(RewriteContext context)
-            {
-                var req = context.HttpContext.Request;
-                req.Path = new PathString("/index.php");
-                context.Result = RuleResult.SkipRemainingRules;
-            }
-            app.UsePhp(new PhpRequestOptions(scriptAssemblyName: "Website"));
-        }
-    }
-}

+ 0 - 17
frameworks/PHP/hamlet/deploy/peachpie/Server/Server.csproj

@@ -1,17 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-  <PropertyGroup>
-    <TargetFramework>netcoreapp2.1</TargetFramework>
-    <OutputType>Exe</OutputType>
-  </PropertyGroup>
-  <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Buffering" Version="0.2.2" />
-    <PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
-    <PackageReference Include="Peachpie.AspNetCore.Web" Version="0.9.40" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="../../../Website.msbuildproj" />
-  </ItemGroup>
-</Project>

+ 0 - 21
frameworks/PHP/hamlet/hamlet-peachpie.dockerfile

@@ -1,21 +0,0 @@
-FROM microsoft/dotnet:2.2-sdk-stretch
-
-COPY . /wwwroot
-WORKDIR /wwwroot
-
-RUN apt update -y \
-    && apt install -y ca-certificates apt-transport-https \
-    && wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add - \
-    && echo "deb https://packages.sury.org/php/ stretch main" | tee /etc/apt/sources.list.d/php.list \
-    && apt-get update -y \
-    && apt-get install -y nginx git unzip php7.3 php7.3-common php7.3-cli php7.3-fpm php7.3-mysql
-
-RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
-    && composer update --no-dev
-
-RUN dotnet publish -c Release -o /wwwroot /wwwroot/deploy/peachpie/Server
-
-EXPOSE 8080/tcp
-ENV ASPNETCORE_URLS="http://+:8080"
-
-ENTRYPOINT ["dotnet", "Server.dll"]

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

@@ -1,4 +1,6 @@
-FROM debian:stretch
+FROM ubuntu:18.10
+
+ARG DEBIAN_FRONTEND=noninteractive
 
 RUN apt update -y \
     && apt install -y gnupg ca-certificates apt-transport-https wget curl \