Browse Source

Add laravel-s bechmark for laravel/lumen (#6216)

* add laravel-s benchmark

* rename lumen-s to laravel-s

* optimize codestyle
Biao Xie 4 years ago
parent
commit
de11533c7c

+ 4 - 1
frameworks/PHP/laravel/README.md

@@ -114,4 +114,7 @@ http://localhost:8080/updates/[count]
 
 
 ### FORTUNES
 ### FORTUNES
 
 
-http://localhost:8080/fortunes
+http://localhost:8080/fortunes
+
+# Add laravel-s Benchmarking Test
+[laravel-s](https://github.com/hhxsv5/laravel-s) is an out-of-the-box adapter between Swoole and Laravel/Lumen, similar to laravel-swoole.

+ 76 - 83
frameworks/PHP/laravel/app/Http/Controllers/Controller.php

@@ -1,91 +1,84 @@
 <?php
 <?php
+
 namespace App\Http\Controllers;
 namespace App\Http\Controllers;
 
 
 use App\Models\Fortune;
 use App\Models\Fortune;
 use App\Models\World;
 use App\Models\World;
 use Illuminate\Routing\Controller as BaseController;
 use Illuminate\Routing\Controller as BaseController;
 
 
-class Controller extends BaseController {
-
-	public function json() {
-		return [
-			'message' => 'Hello, World!'
-		];
-	}
-
-	public function db() {
-		return World::where('id', \mt_rand(1, 10000))->first(); // to compare with find()
-	}
-
-	public function queries($queries = 1) {
-		$rows = [];
-		$numbers = $this->getUniqueRandomNumbers($this->clamp($queries));
-		foreach ($numbers as $id) {
-			$rows[] = World::find($id);
-		}
-
-		return $rows;
-	}
-
-	public function fortunes() {
-		$rows = Fortune::all();
-
-		$insert = new Fortune();
-		$insert->id = 0;
-		$insert->message = 'Additional fortune added at request time.';
-
-		$rows->add($insert);
-		$rows = $rows->sortBy('message');
-
-		return view('fortunes', [
-			'rows' => $rows
-		]);
-	}
-
-	public function updates($queries = 1) {
-		$rows = [];
-
-		$numbers = $this->getUniqueRandomNumbers($this->clamp($queries));
-		foreach ($numbers as $id) {
-			$row = World::find($id);
-			$oldId = $row->randomNumber;
-			do {
-				$newId = mt_rand(1, 10000);
-			} while ($oldId === $newId);
-			$row->randomNumber = $newId;
-			do {
-				try {
-					$saved = $row->save();
-				} catch (\Exception $e) {
-					$saved = false;
-				}
-			} while (! $saved);
-			$rows[] = $row;
-		}
-
-		return $rows;
-	}
-
-	public function plaintext() {
-		return response('Hello, World!')->header('Content-Type', 'text/plain');
-	}
-
-	private function clamp($value): int {
-		if (! \is_numeric($value) || $value < 1) {
-			return 1;
-		} else if ($value > 500) {
-			return 500;
-		} else {
-			return $value;
-		}
-	}
-
-	private function getUniqueRandomNumbers($count) {
-		$res = [];
-		do {
-			$res[\mt_rand(1, 10000)] = 1;
-		} while (\count($res) < $count);
-		\ksort($res);
-		return \array_keys($res);
-	}
+class Controller extends BaseController
+{
+    public function json()
+    {
+        return response()->json(['message' => 'Hello, World!']);
+    }
+
+    public function db()
+    {
+        return response()->json(World::query()->find(self::randomInt()));
+    }
+
+    public function queries($queries = 1)
+    {
+        $queries = self::clamp($queries);
+
+        $rows = [];
+        while ($queries--) {
+            $rows[] = World::query()->find(self::randomInt());
+        }
+
+        return response()->json($rows);
+    }
+
+    public function fortunes()
+    {
+        $rows = Fortune::all();
+
+        $insert = new Fortune();
+        $insert->id = 0;
+        $insert->message = 'Additional fortune added at request time.';
+
+        $rows->add($insert);
+        $rows = $rows->sortBy('message');
+
+        return view('fortunes', ['rows' => $rows]);
+    }
+
+    public function updates($queries = 1)
+    {
+        $queries = self::clamp($queries);
+
+        $rows = [];
+
+        while ($queries--) {
+            $row = World::query()->find(self::randomInt());
+            $row->randomNumber = self::randomInt();
+            $row->save();
+
+            $rows[] = $row;
+        }
+
+        return response()->json($rows);
+    }
+
+    public function plaintext()
+    {
+        return response('Hello, World!', 200, ['Content-Type' => 'text/plain']);
+    }
+
+    private static function randomInt()
+    {
+        return random_int(1, 10000);
+    }
+
+    private static function clamp($value)
+    {
+        if (!is_numeric($value) || $value < 1) {
+            return 1;
+        }
+        if ($value > 500) {
+            return 500;
+        }
+        return (int)$value;
+    }
 }
 }

+ 24 - 1
frameworks/PHP/laravel/benchmark_config.json

@@ -14,7 +14,7 @@
 			"database": "MySQL",
 			"database": "MySQL",
 			"framework": "laravel",
 			"framework": "laravel",
 			"language": "PHP",
 			"language": "PHP",
-			"flavor": "PHP7",
+			"flavor": "PHP8",
 			"orm": "Full",
 			"orm": "Full",
 			"platform": "FPM/FastCGI",
 			"platform": "FPM/FastCGI",
 			"webserver": "nginx",
 			"webserver": "nginx",
@@ -46,6 +46,29 @@
 			"display_name": "laravel-swoole",
 			"display_name": "laravel-swoole",
 			"notes": "",
 			"notes": "",
 			"versus": "swoole"
 			"versus": "swoole"
+		},
+		"laravel-s": {
+			"json_url": "/json",
+			"db_url": "/db",
+			"query_url": "/queries/",
+			"fortune_url": "/fortunes",
+			"update_url": "/updates/",
+			"plaintext_url": "/plaintext",
+			"port": 5200,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "MySQL",
+			"framework": "laravel",
+			"language": "PHP",
+			"flavor": "None",
+			"orm": "Full",
+			"platform": "swoole",
+			"webserver": "none",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "laravel-s",
+			"notes": "",
+			"versus": "swoole"
 		}
 		}
 	}]
 	}]
 }
 }

+ 58 - 0
frameworks/PHP/laravel/deploy/laravel-s/composer.json

@@ -0,0 +1,58 @@
+{
+    "name": "laravel/laravel",
+    "type": "project",
+    "description": "The Laravel Framework.",
+    "keywords": [
+        "framework",
+        "laravel"
+    ],
+    "license": "MIT",
+    "require": {
+        "php": "^7.3|^8.0",
+        "laravel/framework": "^8.0",
+        "hhxsv5/laravel-s": "~3.7.0"
+    },
+    "require-dev": {
+        "facade/ignition": "^2.3.6",
+        "fzaninotto/faker": "^1.9.1",
+        "mockery/mockery": "^1.3.1",
+        "nunomaduro/collision": "^5.0",
+        "phpunit/phpunit": "^9.3"
+    },
+    "config": {
+        "optimize-autoloader": true,
+        "preferred-install": "dist",
+        "sort-packages": true
+    },
+    "extra": {
+        "laravel": {
+            "dont-discover": []
+        }
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "app/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "scripts": {
+        "post-autoload-dump": [
+            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+            "@php artisan package:discover --ansi"
+        ],
+        "post-root-package-install": [
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-create-project-cmd": [
+            "@php artisan key:generate --ansi"
+        ]
+    }
+}
+
+

+ 17 - 0
frameworks/PHP/laravel/deploy/laravel-s/install-composer.sh

@@ -0,0 +1,17 @@
+#!/bin/sh
+
+EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)"
+php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")"
+
+if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
+then
+    >&2 echo 'ERROR: Invalid installer signature'
+    rm composer-setup.php
+    exit 1
+fi
+
+php composer-setup.php --quiet
+RESULT=$?
+rm composer-setup.php
+exit $RESULT

+ 29 - 0
frameworks/PHP/laravel/laravel-laravel-s.dockerfile

@@ -0,0 +1,29 @@
+FROM php:8.0
+
+RUN pecl install swoole > /dev/null && \
+    docker-php-ext-enable swoole
+RUN docker-php-ext-install pdo_mysql pcntl opcache > /dev/null
+
+RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+
+ADD ./ /laravel
+WORKDIR /laravel
+
+RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/logs /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache
+RUN chmod -R 777 /laravel
+
+RUN deploy/swoole/install-composer.sh
+RUN apt-get update > /dev/null && \
+    apt-get install -yqq git unzip > /dev/null
+COPY deploy/laravel-s/composer* ./
+
+RUN echo "LARAVELS_LISTEN_IP=0.0.0.0" >> .env
+RUN echo "LARAVELS_LISTEN_PORT=5200" >> .env
+
+RUN php composer.phar install -a --no-dev --quiet
+RUN php artisan optimize
+RUN php artisan laravels publish
+
+CMD bin/laravels start

+ 4 - 0
frameworks/PHP/lumen/README.md

@@ -77,3 +77,7 @@ http://localhost:8080/updates/[count]
 ### FORTUNES
 ### FORTUNES
 
 
 http://localhost:8080/fortunes
 http://localhost:8080/fortunes
+
+
+# Add laravel-s Benchmarking Test
+[laravel-s](https://github.com/hhxsv5/laravel-s) is an out-of-the-box adapter between Swoole and Laravel/Lumen, similar to laravel-swoole.

+ 75 - 63
frameworks/PHP/lumen/app/Http/Controllers/Controller.php

@@ -6,67 +6,79 @@ use App\Models\Fortune;
 use App\Models\World;
 use App\Models\World;
 use Laravel\Lumen\Routing\Controller as BaseController;
 use Laravel\Lumen\Routing\Controller as BaseController;
 
 
-class Controller extends BaseController {
-
-	public function json() {
-		return ['message' => 'Hello, World!'];
-	}
-
-	public function db() {
-		return World::find(random_int(1, 10000));
-	}
-
-	public function queries($queries = 1) {
-		$queries = $this->clamp($queries);
-
-		$rows = [];
-		while ($queries--) {
-			$rows[] = World::find(random_int(1, 10000));
-		}
-
-		return $rows;
-	}
-
-	public function fortunes() {
-		$rows = Fortune::all();
-
-		$insert = new Fortune();
-		$insert->id = 0;
-		$insert->message = "Additional fortune added at request time.";
-
-		$rows->add($insert);
-		$rows = $rows->sortBy("message");
-
-		return response()->make(view("fortunes", ["rows" => $rows]), 200, ['Content-Type' => 'text/html; charset=UTF-8']);
-	}
-
-	public function updates($queries = 1) {
-		$queries = $this->clamp($queries);
-
-		$rows = [];
-
-		while ($queries--) {
-			$row = World::find(random_int(1, 10000));
-			$row->randomNumber = random_int(1, 10000);
-			$row->save();
-
-			$rows[] = $row;
-		}
-
-		return $rows;
-	}
-
-	public function plaintext() {
-		return response("Hello, World!")->header('Content-Type', 'text/plain');
-	}
-
-	private function clamp($value): int {
-		if (!is_numeric($value) || $value < 1) {
-			return 1;
-		} else if ($value > 500) {
-			return 500;
-		} else {
-			return $value;
-		}
-	}
+class Controller extends BaseController
+{
+    public function json()
+    {
+        return response()->json(['message' => 'Hello, World!']);
+    }
+
+    public function db()
+    {
+        return response()->json(World::query()->find(self::randomInt()));
+    }
+
+    public function queries($queries = 1)
+    {
+        $queries = self::clamp($queries);
+
+        $rows = [];
+        while ($queries--) {
+            $rows[] = World::query()->find(self::randomInt());
+        }
+
+        return response()->json($rows);
+    }
+
+    public function fortunes()
+    {
+        $rows = Fortune::all();
+
+        $insert = new Fortune();
+        $insert->id = 0;
+        $insert->message = 'Additional fortune added at request time.';
+
+        $rows->add($insert);
+        $rows = $rows->sortBy('message');
+
+        return view('fortunes', ['rows' => $rows]);
+    }
+
+    public function updates($queries = 1)
+    {
+        $queries = self::clamp($queries);
+
+        $rows = [];
+
+        while ($queries--) {
+            $row = World::query()->find(self::randomInt());
+            $row->randomNumber = self::randomInt();
+            $row->save();
+
+            $rows[] = $row;
+        }
+
+        return response()->json($rows);
+    }
+
+    public function plaintext()
+    {
+        return response('Hello, World!', 200, ['Content-Type' => 'text/plain']);
+    }
+
+    private static function randomInt()
+    {
+        return random_int(1, 10000);
+    }
+
+    private static function clamp($value)
+    {
+        if (!is_numeric($value) || $value < 1) {
+            return 1;
+        }
+        if ($value > 500) {
+            return 500;
+        }
+        return (int)$value;
+    }
 }
 }

+ 25 - 2
frameworks/PHP/lumen/benchmark_config.json

@@ -15,7 +15,7 @@
 			"database": "MySQL",
 			"database": "MySQL",
 			"framework": "lumen",
 			"framework": "lumen",
 			"language": "PHP",
 			"language": "PHP",
-			"flavor": "PHP7",
+			"flavor": "PHP8",
 			"orm": "Full",
 			"orm": "Full",
 			"platform": "FPM/FastCGI",
 			"platform": "FPM/FastCGI",
 			"webserver": "nginx",
 			"webserver": "nginx",
@@ -38,7 +38,7 @@
 			"database": "MySQL",
 			"database": "MySQL",
 			"framework": "lumen",
 			"framework": "lumen",
 			"language": "PHP",
 			"language": "PHP",
-			"flavor": "PHP7",
+			"flavor": "PHP8",
 			"orm": "Full",
 			"orm": "Full",
 			"platform": "swoole",
 			"platform": "swoole",
 			"webserver": "none",
 			"webserver": "none",
@@ -46,6 +46,29 @@
 			"database_os": "Linux",
 			"database_os": "Linux",
 			"display_name": "lumen-swoole",
 			"display_name": "lumen-swoole",
 			"versus": "swoole"
 			"versus": "swoole"
+		},
+		"laravel-s": {
+			"json_url": "/json",
+			"db_url": "/db",
+			"query_url": "/queries/",
+			"fortune_url": "/fortunes",
+			"update_url": "/updates/",
+			"plaintext_url": "/plaintext",
+			"port": 5200,
+			"approach": "Realistic",
+			"classification": "Micro",
+			"database": "MySQL",
+			"framework": "lumen",
+			"language": "PHP",
+			"flavor": "PHP8",
+			"orm": "Full",
+			"platform": "swoole",
+			"webserver": "none",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "laravel-s",
+			"notes": "",
+			"versus": "swoole"
 		}
 		}
 	}]
 	}]
 }
 }

+ 3 - 0
frameworks/PHP/lumen/bootstrap/app.php

@@ -52,6 +52,9 @@ if (env('APP_SWOOLE', false)) {
 	$app->register(\SwooleTW\Http\LumenServiceProvider::class);
 	$app->register(\SwooleTW\Http\LumenServiceProvider::class);
 	$app->configure('swoole_http');
 	$app->configure('swoole_http');
 }
 }
+if (class_exists('Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider')) {
+    $app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);
+}
 $app->configure('database');
 $app->configure('database');
 /*
 /*
  * |--------------------------------------------------------------------------
  * |--------------------------------------------------------------------------

+ 37 - 0
frameworks/PHP/lumen/deploy/laravel-s/composer.json

@@ -0,0 +1,37 @@
+{
+    "name": "laravel/lumen",
+    "description": "The Laravel Lumen Framework.",
+    "keywords": ["framework", "laravel", "lumen"],
+    "license": "MIT",
+    "type": "project",
+    "require": {
+        "laravel/lumen-framework": "^8.2",
+        "hhxsv5/laravel-s": "~3.7.0"
+    },
+    "require-dev": {
+        "fzaninotto/faker": "^1.9.1",
+        "mockery/mockery": "^1.3.1",
+        "phpunit/phpunit": "^9.3"
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "app/"
+        }
+    },
+    "autoload-dev": {
+        "classmap": [
+            "tests/",
+            "database/"
+        ]
+    },
+    "scripts": {
+        "post-root-package-install": [
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ]
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "config": {
+        "optimize-autoloader": true
+    }
+}

+ 17 - 0
frameworks/PHP/lumen/deploy/laravel-s/install-composer.sh

@@ -0,0 +1,17 @@
+#!/bin/sh
+
+EXPECTED_SIGNATURE="$(curl -s https://composer.github.io/installer.sig)"
+php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")"
+
+if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
+then
+    >&2 echo 'ERROR: Invalid installer signature'
+    rm composer-setup.php
+    exit 1
+fi
+
+php composer-setup.php --quiet
+RESULT=$?
+rm composer-setup.php
+exit $RESULT

+ 28 - 0
frameworks/PHP/lumen/lumen-laravel-s.dockerfile

@@ -0,0 +1,28 @@
+FROM php:8.0
+
+RUN pecl install swoole > /dev/null && \
+    docker-php-ext-enable swoole
+RUN docker-php-ext-install pdo_mysql pcntl opcache > /dev/null
+
+RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+RUN echo "opcache.jit=1205" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+RUN echo "opcache.jit_buffer_size=128M" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini
+
+ADD ./ /lumen
+WORKDIR /lumen
+
+RUN mkdir -p /lumen/bootstrap/cache /lumen/storage/logs /lumen/storage/framework/sessions /lumen/storage/framework/views /lumen/storage/framework/cache
+RUN chmod -R 777 /lumen
+
+RUN deploy/swoole/install-composer.sh
+RUN apt-get update > /dev/null && \
+    apt-get install -yqq git unzip > /dev/null
+COPY deploy/laravel-s/composer* ./
+
+RUN echo "LARAVELS_LISTEN_IP=0.0.0.0" >> .env
+RUN echo "LARAVELS_LISTEN_PORT=5200" >> .env
+
+RUN php composer.phar install -a --no-dev --quiet
+RUN php artisan laravels publish
+
+CMD bin/laravels start