server.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. require_once __DIR__.'/vendor/autoload.php';
  3. use Workerman\Worker;
  4. use Workerman\Events\Swow;
  5. use Workerman\Events\Swoole;
  6. use Workerman\Events\Select;
  7. use Workerman\Protocols\Http\Response;
  8. $test_type = getenv('TEST_TYPE') ?: 'default';
  9. $process = getenv('PROCESS_MULTIPLIER') ?: 1;
  10. $pool_size = getenv('POOL_SIZE') ?: 2;
  11. $process_count = (int) shell_exec('nproc') * $process;
  12. $db = $date = null;
  13. $http_worker = new Worker('http://0.0.0.0:8080');
  14. //$http_worker->reusePort = true;
  15. $http_worker->count = $process_count;
  16. $http_worker->onWorkerStart = static function () use ($test_type, $pool_size, &$db, &$date) {
  17. $db = match ($test_type) {
  18. 'pgsql' => new Pgsql(),
  19. 'mysql' => new Mysql(),
  20. 'pgsql-swow' => new PgsqlSwow($pool_size),
  21. 'mysql-swow' => new MysqlSwow($pool_size),
  22. 'pgsql-swoole' => new PgsqlSwoole($pool_size),
  23. 'mysql-swoole' => new MysqlSwoole($pool_size),
  24. 'default' => new Mysql(),
  25. };
  26. $date = new Date();
  27. };
  28. if ($test_type === 'default') {
  29. Worker::$eventLoopClass = Select::class;
  30. } elseif (in_array($test_type, ['pgsql-swow', 'mysql-swow'])) {
  31. Worker::$eventLoopClass = Swow::class;
  32. } elseif (in_array($test_type, ['pgsql-swoole', 'mysql-swoole'])) {
  33. Worker::$eventLoopClass = Swoole::class;
  34. }
  35. $http_worker->onMessage = static function ($connection, $request) use (&$db, &$date) {
  36. switch ($request->path()) {
  37. case '/plaintext':
  38. $connection->headers = [
  39. 'Content-Type' => 'text/plain',
  40. 'Date' => $date->date
  41. ];
  42. return $connection->send('Hello, World!');
  43. case '/json':
  44. $connection->headers = [
  45. 'Content-Type' => 'application/json',
  46. 'Date' => $date->date
  47. ];
  48. return $connection->send(json_encode(['message' => 'Hello, World!']));
  49. case '/db':
  50. $connection->headers = [
  51. 'Content-Type' => 'application/json',
  52. 'Date' => $date->date
  53. ];
  54. return $connection->send(json_encode($db->db()));
  55. case '/fortunes':
  56. $connection->headers = [
  57. 'Date' => $date->date
  58. ];
  59. return $connection->send($db->fortune());
  60. case '/query':
  61. $connection->headers = [
  62. 'Content-Type' => 'application/json',
  63. 'Date' => $date->date
  64. ];
  65. return $connection->send(json_encode($db->query($request)));
  66. case '/update':
  67. $connection->headers = [
  68. 'Content-Type' => 'application/json',
  69. 'Date' => $date->date
  70. ];
  71. return $connection->send(json_encode($db->update($request)));
  72. }
  73. return $connection->send(new Response(404, [
  74. 'Content-Type' => 'text/plain',
  75. 'Date' => $date->date
  76. ], '404 Not Found'));
  77. };
  78. Worker::runAll();