database.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. declare(strict_types=1);
  3. use Swoole\Database\PDOConfig;
  4. use Swoole\Database\PDOPool;
  5. use Swoole\Database\PDOProxy;
  6. use Swoole\Database\PDOStatementProxy;
  7. class Operation
  8. {
  9. public const WORLD_SELECT_SQL = 'SELECT id,randomNumber FROM World WHERE id = ?';
  10. public const FORTUNE_SQL = 'SELECT id, message FROM Fortune';
  11. public const WORLD_UPDATE_SQL = 'UPDATE World SET randomNumber = ? WHERE id = ?';
  12. public static function db(PDOStatement|PDOStatementProxy $db): string
  13. {
  14. $db->execute([mt_rand(1, 10000)]);
  15. return json_encode($db->fetch(PDO::FETCH_ASSOC), JSON_NUMERIC_CHECK);
  16. }
  17. public static function fortunes(PDOStatement|PDOStatementProxy $fortune): string
  18. {
  19. $fortune->execute();
  20. $results = $fortune->fetchAll(PDO::FETCH_KEY_PAIR);
  21. $results[0] = 'Additional fortune added at request time.';
  22. asort($results);
  23. $html = '';
  24. foreach ($results as $id => $message) {
  25. $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
  26. $html .= "<tr><td>$id</td><td>$message</td></tr>";
  27. }
  28. return "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>$html</table></body></html>";
  29. }
  30. public static function query(PDOStatement|PDOStatementProxy $query, int $queries): string
  31. {
  32. $query_count = 1;
  33. if ($queries > 1) {
  34. $query_count = min($queries, 500);
  35. }
  36. $results = [];
  37. while ($query_count--) {
  38. $query->execute([mt_rand(1, 10000)]);
  39. $results[] = $query->fetch(PDO::FETCH_ASSOC);
  40. }
  41. return json_encode($results, JSON_NUMERIC_CHECK);
  42. }
  43. public static function updates(PDOStatement|PDOStatementProxy $random, PDOStatement|PDOStatementProxy $update, int $queries): string
  44. {
  45. $query_count = 1;
  46. if ($queries > 1) {
  47. $query_count = min($queries, 500);
  48. }
  49. $results = [];
  50. while ($query_count--) {
  51. $id = mt_rand(1, 10000);
  52. $random->execute([$id]);
  53. $item = $random->fetch(PDO::FETCH_ASSOC);
  54. $update->execute([$item['randomNumber'] = mt_rand(1, 10000), $id]);
  55. $results[] = $item;
  56. }
  57. return json_encode($results, JSON_NUMERIC_CHECK);
  58. }
  59. }
  60. class Connection
  61. {
  62. private static PDOStatement $db;
  63. private static PDOStatement $fortune;
  64. private static PDOStatement $random;
  65. private static PDOStatement $update;
  66. private static PDOStatement $query;
  67. public static function init(string $driver): void
  68. {
  69. $pdo = new PDO(
  70. "$driver:host=tfb-database;dbname=hello_world",
  71. "benchmarkdbuser",
  72. "benchmarkdbpass",
  73. [
  74. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  75. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  76. PDO::ATTR_EMULATE_PREPARES => false
  77. ]
  78. );
  79. self::$db = self::$random = self::$query = $pdo->prepare(Operation::WORLD_SELECT_SQL);
  80. self::$fortune = $pdo->prepare(Operation::FORTUNE_SQL);
  81. self::$update = $pdo->prepare(Operation::WORLD_UPDATE_SQL);
  82. }
  83. public static function db(): string
  84. {
  85. return Operation::db(self::$db);
  86. }
  87. public static function fortunes(): string
  88. {
  89. return Operation::fortunes(self::$fortune);
  90. }
  91. public static function query(int $queries): string
  92. {
  93. return Operation::query(self::$query, $queries);
  94. }
  95. public static function updates(int $queries): string
  96. {
  97. return Operation::updates(self::$random, self::$update, $queries);
  98. }
  99. }
  100. class Connections
  101. {
  102. private static PDOPool $pool;
  103. public static function init(string $driver): void
  104. {
  105. $config = (new PDOConfig())
  106. ->withDriver($driver)
  107. ->withHost('tfb-database')
  108. ->withPort($driver == 'mysql' ? 3306 : 5432)
  109. ->withDbName('hello_world')
  110. ->withUsername('benchmarkdbuser')
  111. ->withPassword('benchmarkdbpass');
  112. self::$pool = new PDOPool($config, intval(1024 / swoole_cpu_num()));
  113. }
  114. public static function db(): string
  115. {
  116. $pdo = self::get();
  117. $result = Operation::db($pdo->prepare(Operation::WORLD_SELECT_SQL));
  118. self::put($pdo);
  119. return $result;
  120. }
  121. public static function fortunes(): string
  122. {
  123. $pdo = self::get();
  124. $result = Operation::fortunes($pdo->prepare(Operation::FORTUNE_SQL));
  125. self::put($pdo);
  126. return $result;
  127. }
  128. public static function query(int $queries): string
  129. {
  130. $pdo = self::get();
  131. $result = Operation::query($pdo->prepare(Operation::WORLD_SELECT_SQL), $queries);
  132. self::put($pdo);
  133. return $result;
  134. }
  135. public static function updates(int $queries): string
  136. {
  137. $pdo = self::get();
  138. $result = Operation::updates($pdo->prepare(Operation::WORLD_SELECT_SQL), $pdo->prepare(Operation::WORLD_UPDATE_SQL), $queries);
  139. self::put($pdo);
  140. return $result;
  141. }
  142. private static function get(): PDO|PDOProxy
  143. {
  144. return self::$pool->get();
  145. }
  146. private static function put(PDO|PDOProxy $db): void
  147. {
  148. self::$pool->put($db);
  149. }
  150. }