random_server.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. /**
  3. * Websocket server that read/write random data.
  4. * Run in console: php examples/random_server.php
  5. *
  6. * Console options:
  7. * --port <int> : The port to listen to, default 8000
  8. * --timeout <int> : Timeout in seconds, random default
  9. * --fragment_size <int> : Fragment size as bytes, random default
  10. * --debug : Output log data (if logger is available)
  11. */
  12. namespace WebSocket;
  13. require __DIR__ . '/../vendor/autoload.php';
  14. error_reporting(-1);
  15. $randStr = function (int $maxlength = 4096) {
  16. $string = '';
  17. $length = rand(1, $maxlength);
  18. for ($i = 0; $i < $length; $i++) {
  19. $string .= chr(rand(33, 126));
  20. }
  21. return $string;
  22. };
  23. echo "> Random server\n";
  24. // Server options specified or random
  25. $options = array_merge([
  26. 'port' => 8000,
  27. 'timeout' => rand(1, 60),
  28. 'fragment_size' => rand(1, 4096) * 8,
  29. ], getopt('', ['port:', 'timeout:', 'fragment_size:', 'debug']));
  30. // If debug mode and logger is available
  31. if (isset($options['debug']) && class_exists('WebSocket\EchoLog')) {
  32. $logger = new EchoLog();
  33. $options['logger'] = $logger;
  34. echo "> Using logger\n";
  35. }
  36. // Force quit to close server
  37. while (true) {
  38. try {
  39. // Setup server
  40. $server = new Server($options);
  41. $info = json_encode([
  42. 'port' => $server->getPort(),
  43. 'timeout' => $options['timeout'],
  44. 'framgemt_size' => $server->getFragmentSize(),
  45. ]);
  46. echo "> Creating server {$info}\n";
  47. while ($server->accept()) {
  48. while (true) {
  49. // Random actions
  50. switch (rand(1, 10)) {
  51. case 1:
  52. echo "> Sending text\n";
  53. $server->text("Text message {$randStr()}");
  54. break;
  55. case 2:
  56. echo "> Sending binary\n";
  57. $server->binary("Binary message {$randStr()}");
  58. break;
  59. case 3:
  60. echo "> Sending close\n";
  61. $server->close(rand(1000, 2000), "Close message {$randStr(8)}");
  62. break;
  63. case 4:
  64. echo "> Sending ping\n";
  65. $server->ping("Ping message {$randStr(8)}");
  66. break;
  67. case 5:
  68. echo "> Sending pong\n";
  69. $server->pong("Pong message {$randStr(8)}");
  70. break;
  71. default:
  72. echo "> Receiving\n";
  73. $received = $server->receive();
  74. echo "> Received {$server->getLastOpcode()}: {$received}\n";
  75. }
  76. sleep(rand(1, 5));
  77. }
  78. }
  79. } catch (\Throwable $e) {
  80. echo "ERROR: {$e->getMessage()} [{$e->getCode()}]\n";
  81. }
  82. sleep(rand(1, 5));
  83. }