execute([mt_rand(1, 10000)]); return json_encode($db->fetch(PDO::FETCH_ASSOC)); } public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string { $fortune->execute(); $results = $fortune->fetchAll(PDO::FETCH_KEY_PAIR); $results[0] = 'Additional fortune added at request time.'; asort($results); $html = ''; foreach ($results as $id => $message) { $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); $html .= "$id$message"; } return "Fortunes$html
idmessage
"; } public static function query(PDOStatement|PDOStatementProxy $query, int $queries): string { $results = []; while ($queries--) { $query->execute([mt_rand(1, 10000)]); $results[] = $query->fetch(PDO::FETCH_ASSOC); } return json_encode($results); } public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries, string $driver): string { $results = $keys = $values = []; while ($queries--) { $random->execute([mt_rand(1, 10000)]); $item = $random->fetch(PDO::FETCH_ASSOC); $item['randomNumber'] = mt_rand(1, 10000); $results[] = $item; if ($driver == 'pgsql') { $values[] = $keys[] = $item['id']; $values[] = $item['randomNumber']; } else { $update->execute([$item['randomNumber'], $item['id']]); } } if ($driver == 'pgsql') { $update->execute([...$values, ...$keys]); } return json_encode($results); } } class Connection { private static PDO $pdo; private static string $driver; private static array $updates = []; private static PDOStatement $db; private static PDOStatement $fortune; private static PDOStatement $random; private static PDOStatement $query; public static function init(string $driver): void { $pdo = new PDO( "$driver:host=tfb-database;dbname=hello_world", "benchmarkdbuser", "benchmarkdbpass", [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false ] ); self::$db = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL); self::$fortune = $pdo->prepare(Operation::FORTUNE_SQL); self::$pdo = $pdo; self::$driver = $driver; } public static function db(): string { return Operation::db(self::$db); } public static function fortunes(): string { return Operation::fortunes(self::$fortune); } public static function query(int $queries): string { return Operation::query(self::$query, $queries); } public static function updates(int $queries): string { if (!isset(self::$updates[$queries])) { self::$updates[$queries] = self::$driver == 'pgsql' ? self::$pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') : self::$pdo->prepare(Operation::WORLD_UPDATE_SQL); } return Operation::updates(self::$random, self::$updates[$queries], $queries, self::$driver); } } class Connections { private static PDOPool $pool; private static string $driver; public static function init(string $driver): void { $config = (new PDOConfig()) ->withDriver($driver) ->withHost('tfb-database') ->withPort($driver == 'mysql' ? 3306 : 5432) ->withDbName('hello_world') ->withUsername('benchmarkdbuser') ->withPassword('benchmarkdbpass'); self::$pool = new PDOPool($config, intval(1400 / swoole_cpu_num())); self::$driver = $driver; } public static function db(): string { $pdo = self::get(); $result = Operation::db(self::getStatement($pdo, 'select')); self::put($pdo); return $result; } public static function fortunes(): string { $pdo = self::get(); $result = Operation::fortunes(self::getStatement($pdo, 'fortunes')); self::put($pdo); return $result; } public static function query(int $queries): string { $pdo = self::get(); $result = Operation::query(self::getStatement($pdo, 'select'), $queries); self::put($pdo); return $result; } public static function updates(int $queries): string { $pdo = self::get(); $result = Operation::updates(self::getStatement($pdo, 'select'), self::getStatement($pdo, 'update', $queries), $queries, self::$driver); self::put($pdo); return $result; } private static function get(): PDO|PDOProxy { return self::$pool->get(); } private static function put(PDO|PDOProxy $db): void { self::$pool->put($db); } private static function getStatement(PDO|PDOProxy $pdo, string $type, int $queries = 0): PDOStatement|PDOStatementProxy { if ('select' == $type) { return $pdo->prepare(Operation::WORLD_SELECT_SQL); } elseif ('fortunes' == $type) { return $pdo->prepare(Operation::FORTUNE_SQL); } else { return self::$driver == 'pgsql' ? $pdo->prepare('UPDATE World SET randomNumber = CASE id'.\str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $queries).'END WHERE id IN ('.\str_repeat('?::INTEGER,', $queries - 1).'?::INTEGER)') : $pdo->prepare(Operation::WORLD_UPDATE_SQL); } } }