index.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. error_reporting(-1);
  3. require_once __DIR__.'/vendor/autoload.php';
  4. use DI\Container;
  5. use Psr\Http\Message\ResponseInterface as Response;
  6. use Psr\Http\Message\ServerRequestInterface as Request;
  7. use Slim\Factory\AppFactory;
  8. use Slim\Views\PhpRenderer;
  9. //global $app; // workerman
  10. $container = new Container();
  11. $container->set('db', new PDO(
  12. 'mysql:host=tfb-database;dbname=hello_world;charset=utf8',
  13. 'benchmarkdbuser',
  14. 'benchmarkdbpass',
  15. [
  16. PDO::ATTR_PERSISTENT => true,
  17. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  18. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  19. //PDO::ATTR_EMULATE_PREPARES => false, // workerman
  20. ]));
  21. $container->set('view', new PhpRenderer('templates'));
  22. AppFactory::setContainer($container);
  23. $app = AppFactory::create();
  24. // Test 1: Plaintext
  25. $app->get('/plaintext', fn(Request $request, Response $response) =>
  26. $response
  27. ->write('Hello, World!')
  28. ->withHeader('Content-Type', 'text/plain')
  29. );
  30. // Test 2: JSON serialization
  31. $app->get('/json', fn(Request $request, Response $response) =>
  32. $response
  33. ->withJson(['message' => 'Hello, World!'])
  34. );
  35. // Test 3: Single database query
  36. $app->get('/db', function (Request $request, Response $response) {
  37. $sth = $this->get('db')->prepare('SELECT * FROM World WHERE id = ?');
  38. $sth->execute([mt_rand(1, 10000)]);
  39. $world = $sth->fetch();
  40. # Cast fields to int so they don't get wrapped with quotes
  41. $world['id'] = (int) $world['id'];
  42. $world['randomNumber'] = (int) $world['randomNumber'];
  43. return $response
  44. ->withJson($world);
  45. });
  46. // Test 4: Multiple database queries
  47. $app->get('/dbs', function (Request $request, Response $response) {
  48. $queries = $request->getParam('queries');
  49. if (is_numeric($queries)) {
  50. $queries = max(1, min($queries, 500));
  51. } else {
  52. $queries = 1;
  53. }
  54. $sth = $this->get('db')->prepare('SELECT * FROM World WHERE id = ?');
  55. $worlds = [];
  56. for ($i = 0; $i < $queries; ++$i) {
  57. $sth->execute([mt_rand(1, 10000)]);
  58. $world = $sth->fetch();
  59. # Cast fields to int so they don't get wrapped with quotes
  60. $world['id'] = (int) $world['id'];
  61. $world['randomNumber'] = (int) $world['randomNumber'];
  62. $worlds[] = $world;
  63. }
  64. return $response
  65. ->withJson($worlds);
  66. });
  67. // Test 5: Updates
  68. $app->get('/updates', function (Request $request, Response $response) {
  69. $queries = $request->getParam('queries');
  70. if (is_numeric($queries)) {
  71. $queries = max(1, min($queries, 500));
  72. } else {
  73. $queries = 1;
  74. }
  75. $sth = $this->get('db')->prepare('SELECT * FROM World WHERE id = ?');
  76. $updateSth = $this->get('db')->prepare('UPDATE World SET randomNumber = ? WHERE id = ?');
  77. $worlds = [];
  78. for ($i = 0; $i < $queries; ++$i) {
  79. $id = mt_rand(1, 10000);
  80. $random_number = mt_rand(1, 10000);
  81. $sth->execute([$id]);
  82. $world = $sth->fetch();
  83. # Cast fields to int so they don't get wrapped with quotes
  84. $world['id'] = (int) $world['id'];
  85. $world['randomNumber'] = $random_number;
  86. $updateSth->execute([$world['randomNumber'], $world['id']]);
  87. $worlds[] = $world;
  88. }
  89. return $response
  90. ->withJson($worlds);
  91. });
  92. // Test 6: Fortunes
  93. $app->get('/fortunes', function (Request $request, Response $response) {
  94. $fortunes = $this->get('db')->query('SELECT * FROM Fortune')->fetchAll(PDO::FETCH_KEY_PAIR);
  95. $fortunes[0] = 'Additional fortune added at request time.';
  96. asort($fortunes);
  97. return $this->get('view')->render($response, 'fortunes.php', ['fortunes' => $fortunes]);
  98. });
  99. $app->run(); // comented with workerman
  100. // used by Workerman
  101. function run(): string
  102. {
  103. global $app;
  104. ob_start();
  105. $app->run();
  106. header(HeaderDate::$date); // To pass the bench, nginx auto add it
  107. return ob_get_clean();
  108. }