format('D, d M Y H:i:s T'); } /** * @return int */ public static function randomInt(): int { try { return \random_int(1, 10000); } catch (Throwable $e) { return mt_rand(1, 10000); } } /** * @param mixed $value * * @return int */ public static function clamp(mixed $value): int { if (!\is_numeric($value) || $value < 1) { return 1; } if ($value > 500) { return 500; } return \intval($value); } /** * @param string $template * @param array $data * * @return string */ public static function render(string $template, array $data = []): string { foreach ($data as $key => $value) { $$key = $value; } \ob_start(); include $template; return \ob_get_clean(); } } $manager = new Manager(); $worker = new class() extends \Ripple\Worker { /*** @var \Ripple\Http\Server */ public Server $server; /** * @param \Ripple\Worker\Manager $manager * * @return void */ public function register(Manager $manager): void { $this->count = 64; $this->server = new Server('http://0.0.0.0:8080'); } /** * @return void */ public function boot(): void { Setup::dateRefresh(); repeat(static fn () => Setup::dateRefresh(), 1); Setup::$pdo = new \PDO( 'mysql:host=tfb-database;port=3306;dbname=hello_world', 'benchmarkdbuser', 'benchmarkdbpass', [ \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, \PDO::ATTR_EMULATE_PREPARES => false, \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ] ); Setup::$queryWorldWhereID = Setup::$pdo->prepare('SELECT id, randomNumber FROM World WHERE id = ?'); Setup::$updateWorldRandomNumber = Setup::$pdo->prepare('UPDATE World SET randomNumber = ? WHERE id = ?'); Setup::$queryFortune = Setup::$pdo->prepare('SELECT * FROM `Fortune`'); $this->server->onRequest(fn (Server\Request $request) => $this->onRequest($request)); $this->server->listen(); } /** * @param \Ripple\Http\Server\Request $request * * @return void */ public function onRequest(Server\Request $request): void { switch ($request->SERVER['REQUEST_URI']) { case '/json': $request->respondJson( ['message' => 'Hello, World!'], ['Date' => Setup::$dateFormatted] ); break; case '/db': $statement = Setup::$queryWorldWhereID; $statement->execute([Setup::randomInt()]); $request->respondJson($statement->fetch(), ['Date' => Setup::$dateFormatted]); break; case '/queries': $queries = Setup::clamp($request->GET['queries'] ?? 1); $results = []; $statement = Setup::$queryWorldWhereID; while ($queries--) { $statement->execute([Setup::randomInt()]); $results[] = $statement->fetch(); } $request->respondJson($results, ['Date' => Setup::$dateFormatted]); break; case '/fortunes': $rows = Setup::$pdo->query('SELECT * FROM `Fortune`')?->fetchAll(); $rows[] = ['id' => 0, 'message' => 'Additional fortune added at request time.']; \usort($rows, function ($a, $b) { return $a['message'] <=> $b['message']; }); $request->respondHtml( Setup::render('fortunes.php', ['rows' => $rows]), [ 'Date' => Setup::$dateFormatted, 'Content-Type' => 'text/html; charset=UTF-8' ] ); break; case '/updates': $queries = Setup::clamp($request->GET['queries'] ?? 1); $results = []; $statement = Setup::$queryWorldWhereID; $update = Setup::$updateWorldRandomNumber; while ($queries--) { $statement->execute([Setup::randomInt()]); $row = $statement->fetch(); $row['randomNumber'] = Setup::randomInt(); $results[] = $row; $update->execute([$row['randomNumber'], $row['id']]); } $request->respondJson($results, ['Date' => Setup::$dateFormatted]); break; case '/plaintext': $request->respond( 'Hello, World!', [ 'Content-Type' => 'text/plain; charset=utf-8', 'Date' => Setup::$dateFormatted ] ); break; default: $request->respond('Not Found', [], 404); } } }; $manager->addWorker($worker); $manager->run(); wait();