start_websocket_server.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. use \Workerman\Worker;
  3. use \Workerman\Autoloader;
  4. // autoload
  5. require_once __DIR__ . '/../../Workerman/Autoloader.php';
  6. Autoloader::setRootPath(__DIR__);
  7. // create Websocket worker
  8. $ws_server = new Worker('Websocket://0.0.0.0:3636');
  9. $ws_server->name = 'SimpleChatWebSocket';
  10. $ws_server->count = 1;
  11. // @see http://doc3.workerman.net/worker-development/on-connect.html
  12. $ws_server->onConnect = function($connection)
  13. {
  14. // on WebSocket handshake
  15. $connection->onWebSocketConnect = function($connection)
  16. {
  17. $data = array(
  18. 'type' => 'login',
  19. 'time' => date('Y-m-d H:i:s'),
  20. // @see http://doc3.workerman.net/worker-development/id.html
  21. 'from_id' => $connection->id,
  22. 'client_list' => get_client_list(),
  23. );
  24. broad_cast(json_encode($data));
  25. };
  26. };
  27. // @see http://doc3.workerman.net/worker-development/on-message.html
  28. $ws_server->onMessage = function($connection, $data)use($ws_server)
  29. {
  30. $data = array(
  31. 'type' => 'say',
  32. 'content' => $data,
  33. 'time' => date('Y-m-d H:i:s'),
  34. // @see http://doc3.workerman.net/worker-development/id.html
  35. 'from_id' => $connection->id,
  36. );
  37. broad_cast(json_encode($data));
  38. };
  39. // @see http://doc3.workerman.net/worker-development/connection-on-close.html
  40. $ws_server->onClose = function($connection)
  41. {
  42. $data = array(
  43. 'type' => 'logout',
  44. 'time' => date('Y-m-d H:i:s'),
  45. // @see http://doc3.workerman.net/worker-development/id.html
  46. 'from_id' => $connection->id,
  47. 'client_list' => get_client_list(),
  48. );
  49. broad_cast(json_encode($data));
  50. };
  51. /**
  52. * broadcast
  53. * @param string $msg
  54. * @return void
  55. */
  56. function broad_cast($msg)
  57. {
  58. global $ws_server;
  59. //@see http://doc3.workerman.net/worker-development/connections.html
  60. foreach($ws_server->connections as $connection)
  61. {
  62. // @see http://doc3.workerman.net/worker-development/send.html
  63. $connection->send($msg);
  64. }
  65. }
  66. /**
  67. * get all client
  68. * @return array
  69. */
  70. function get_client_list()
  71. {
  72. global $ws_server;
  73. $client_list = array();
  74. foreach($ws_server->connections as $connection)
  75. {
  76. $client_list[] = $connection->id;
  77. }
  78. return $client_list;
  79. }
  80. // 如果不是在根目录启动,则运行runAll方法
  81. if(!defined('GLOBAL_START'))
  82. {
  83. Worker::runAll();
  84. }