execute([mt_rand(1, 10000)]); return json_encode($db->fetch(PDO::FETCH_ASSOC), JSON_NUMERIC_CHECK); } 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 { $query_count = 1; if ($queries > 1) { $query_count = min($queries, 500); } $results = []; while ($query_count--) { $query->execute([mt_rand(1, 10000)]); $results[] = $query->fetch(PDO::FETCH_ASSOC); } return json_encode($results, JSON_NUMERIC_CHECK); } public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries): string { $query_count = 1; if ($queries > 1) { $query_count = min($queries, 500); } $results = []; while ($query_count--) { $id = mt_rand(1, 10000); $random->execute([$id]); $item = $random->fetch(PDO::FETCH_ASSOC); $update->execute([$item['randomNumber'] = mt_rand(1, 10000), $id]); $results[] = $item; } return json_encode($results, JSON_NUMERIC_CHECK); } } class Connection { private static PDOStatement $db; private static PDOStatement $fortune; private static PDOStatement $random; private static PDOStatement $update; 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::$update = $pdo->prepare(Operation::WORLD_UPDATE_SQL); } 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 { return Operation::updates(self::$random, self::$update, $queries); } } class Connections { private static PDOPool $pool; 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(1024 / swoole_cpu_num())); } public static function db(): string { $pdo = self::get(); $result = Operation::db($pdo->prepare(Operation::WORLD_SELECT_SQL)); self::put($pdo); return $result; } public static function fortunes(): string { $pdo = self::get(); $result = Operation::fortunes($pdo->prepare(Operation::FORTUNE_SQL)); self::put($pdo); return $result; } public static function query(int $queries): string { $pdo = self::get(); $result = Operation::query($pdo->prepare(Operation::WORLD_SELECT_SQL), $queries); self::put($pdo); return $result; } public static function updates(int $queries): string { $pdo = self::get(); $result = Operation::updates($pdo->prepare(Operation::WORLD_SELECT_SQL), $pdo->prepare(Operation::WORLD_UPDATE_SQL), $queries); 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); } }