|
@@ -2,13 +2,14 @@
|
|
|
|
|
|
require __DIR__ . '/vendor/autoload.php';
|
|
|
|
|
|
+use Amp\Cluster\Cluster;
|
|
|
+use Amp\Coroutine;
|
|
|
use Amp\Http\Server\Request;
|
|
|
use Amp\Http\Server\RequestHandler;
|
|
|
use Amp\Http\Server\Response;
|
|
|
use Amp\Http\Server\Router;
|
|
|
use Amp\Http\Server\Options;
|
|
|
use Amp\Http\Server\Server;
|
|
|
-use Amp\Cluster\Cluster;
|
|
|
use Amp\Promise;
|
|
|
use Amp\Success;
|
|
|
use Psr\Log\NullLogger;
|
|
@@ -20,6 +21,8 @@ Amp\Loop::run(function () {
|
|
|
];
|
|
|
|
|
|
$router = new Router;
|
|
|
+
|
|
|
+ // Case 1 - JSON
|
|
|
$router->addRoute("GET", "/json", new class implements RequestHandler {
|
|
|
public function handleRequest(Request $request): Promise {
|
|
|
return new Success(new Response(200, [
|
|
@@ -31,6 +34,124 @@ Amp\Loop::run(function () {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ // Case 2 - Single Query
|
|
|
+ $router->addRoute("GET", "/db", new class implements RequestHandler {
|
|
|
+ private $mysql;
|
|
|
+
|
|
|
+ public function __construct() {
|
|
|
+ $this->mysql = Amp\Mysql\pool("host=tfb-database user=benchmarkdbuser password=benchmarkdbpass db=hello_world");
|
|
|
+ }
|
|
|
+
|
|
|
+ public function handleRequest(Request $request): Promise {
|
|
|
+ return new Coroutine($this->doHandleRequest($request));
|
|
|
+ }
|
|
|
+
|
|
|
+ private function doHandleRequest($request) {
|
|
|
+ $statement = yield $this->mysql->prepare("SELECT * FROM World WHERE id = ?");
|
|
|
+ $result = yield $statement->execute([mt_rand(1, 10000)]);
|
|
|
+
|
|
|
+ if (yield $result->advance()) {
|
|
|
+ $item = $result->getCurrent();
|
|
|
+ } else {
|
|
|
+ $item = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Response(200, [
|
|
|
+ "content-type" => "application/json",
|
|
|
+ "server" => "amphp/http-server",
|
|
|
+ ], \json_encode($item));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Case 3 - Multiple Queries
|
|
|
+ $router->addRoute("GET", "/queries", new class implements RequestHandler {
|
|
|
+ private $mysql;
|
|
|
+
|
|
|
+ public function __construct() {
|
|
|
+ $this->mysql = Amp\Mysql\pool("host=tfb-database user=benchmarkdbuser password=benchmarkdbpass db=hello_world");
|
|
|
+ }
|
|
|
+
|
|
|
+ public function handleRequest(Request $request): Promise {
|
|
|
+ return new Coroutine($this->doHandleRequest($request));
|
|
|
+ }
|
|
|
+
|
|
|
+ private function doHandleRequest($request) {
|
|
|
+ $query = $request->getUri()->getQuery();
|
|
|
+ \parse_str($query, $queryParams);
|
|
|
+
|
|
|
+ $queries = (int) ($queryParams["queries"] ?? 1);
|
|
|
+ if ($queries < 1) {
|
|
|
+ $queries = 1;
|
|
|
+ } elseif ($queries > 500) {
|
|
|
+ $queries = 500;
|
|
|
+ }
|
|
|
+
|
|
|
+ $items = [];
|
|
|
+
|
|
|
+ $statement = yield $this->mysql->prepare("SELECT * FROM World WHERE id = ?");
|
|
|
+
|
|
|
+ for ($i = 0; $i < $queries; $i++) {
|
|
|
+ $items[] = new Coroutine($this->execute($statement));
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Response(200, [
|
|
|
+ "content-type" => "application/json",
|
|
|
+ "server" => "amphp/http-server",
|
|
|
+ ], \json_encode(yield $items));
|
|
|
+ }
|
|
|
+
|
|
|
+ private function execute($statement) {
|
|
|
+ $result = yield $statement->execute([mt_rand(1, 10000)]);
|
|
|
+ yield $result->advance();
|
|
|
+
|
|
|
+ return $result->getCurrent();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Case 4 - Fortunes
|
|
|
+ $router->addRoute("GET", "/fortunes", new class implements RequestHandler {
|
|
|
+ private $mysql;
|
|
|
+
|
|
|
+ public function __construct() {
|
|
|
+ $this->mysql = Amp\Mysql\pool("host=tfb-database user=benchmarkdbuser password=benchmarkdbpass db=hello_world");
|
|
|
+ }
|
|
|
+
|
|
|
+ public function handleRequest(Request $request): Promise {
|
|
|
+ return new Coroutine($this->doHandleRequest($request));
|
|
|
+ }
|
|
|
+
|
|
|
+ private function doHandleRequest($request) {
|
|
|
+ $result = yield $this->mysql->query("SELECT * FROM Fortune");
|
|
|
+ $items = [];
|
|
|
+
|
|
|
+ while (yield $result->advance()) {
|
|
|
+ $item = $result->getCurrent();
|
|
|
+ $items[$item["id"]] = $item["message"];
|
|
|
+ }
|
|
|
+
|
|
|
+ $items[0] = "Additional fortune added at request time.";
|
|
|
+
|
|
|
+ \asort($items);
|
|
|
+
|
|
|
+ \ob_start();
|
|
|
+
|
|
|
+ require __DIR__ . '/fortunes.php';
|
|
|
+
|
|
|
+ return new Response(200, [
|
|
|
+ "content-type" => "text/html; charset=utf-8",
|
|
|
+ "server" => "amphp/http-server",
|
|
|
+ ], \ob_get_clean());
|
|
|
+ }
|
|
|
+
|
|
|
+ private function execute($statement) {
|
|
|
+ $result = yield $statement->execute([mt_rand(1, 10000)]);
|
|
|
+ yield $result->advance();
|
|
|
+
|
|
|
+ return $result->getCurrent();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // Case 6 - Plaintext
|
|
|
$router->addRoute("GET", "/plaintext", new class implements RequestHandler {
|
|
|
public function handleRequest(Request $request): Promise {
|
|
|
return new Success(new Response(200, [
|
|
@@ -40,9 +161,8 @@ Amp\Loop::run(function () {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- $logHandler = Amp\Cluster\createLogHandler();
|
|
|
$logger = new Monolog\Logger("server");
|
|
|
- $logger->pushHandler($logHandler);
|
|
|
+ $logger->pushHandler(Amp\Cluster\createLogHandler());
|
|
|
|
|
|
$logger->info("Using " . get_class(Amp\Loop::get()));
|
|
|
|