echoserver.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. /**
  3. * This file is used for the tests, but can also serve as an example of a WebSocket\Server.
  4. * Run in console: php examples/echoserver.php
  5. *
  6. * Console options:
  7. * --port <int> : The port to listen to, default 8000
  8. * --timeout <int> : Timeout in seconds, default 200 seconds
  9. * --debug : Output log data (if logger is available)
  10. */
  11. namespace WebSocket;
  12. require __DIR__ . '/../vendor/autoload.php';
  13. error_reporting(-1);
  14. echo "> Echo server\n";
  15. // Server options specified or random
  16. $options = array_merge([
  17. 'port' => 8000,
  18. 'timeout' => 200,
  19. 'filter' => ['text', 'binary', 'ping', 'pong', 'close'],
  20. ], getopt('', ['port:', 'timeout:', 'debug']));
  21. // If debug mode and logger is available
  22. if (isset($options['debug']) && class_exists('WebSocket\EchoLog')) {
  23. $logger = new EchoLog();
  24. $options['logger'] = $logger;
  25. echo "> Using logger\n";
  26. }
  27. // Initiate server.
  28. try {
  29. $server = new Server($options);
  30. } catch (ConnectionException $e) {
  31. echo "> ERROR: {$e->getMessage()}\n";
  32. die();
  33. }
  34. echo "> Listening to port {$server->getPort()}\n";
  35. // Force quit to close server
  36. while (true) {
  37. try {
  38. while ($server->accept()) {
  39. echo "> Accepted on port {$server->getPort()}\n";
  40. while (true) {
  41. $message = $server->receive();
  42. $opcode = $server->getLastOpcode();
  43. if (is_null($message)) {
  44. echo "> Closing connection\n";
  45. continue 2;
  46. }
  47. echo "> Got '{$message}' [opcode: {$opcode}]\n";
  48. if (in_array($opcode, ['ping', 'pong'])) {
  49. $server->send($message);
  50. continue;
  51. }
  52. // Allow certain string to trigger server action
  53. switch ($message) {
  54. case 'exit':
  55. echo "> Client told me to quit. Bye bye.\n";
  56. $server->close();
  57. echo "> Close status: {$server->getCloseStatus()}\n";
  58. exit;
  59. case 'headers':
  60. $server->text(implode("\r\n", $server->getRequest()));
  61. break;
  62. case 'ping':
  63. $server->ping($message);
  64. break;
  65. case 'auth':
  66. $auth = $server->getHeader('Authorization');
  67. $server->text("{$auth} - {$message}");
  68. break;
  69. default:
  70. $server->text($message);
  71. }
  72. }
  73. }
  74. } catch (ConnectionException $e) {
  75. echo "> ERROR: {$e->getMessage()}\n";
  76. }
  77. }