socket.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. /**
  3. * WebSocket 服务端启动文件
  4. *
  5. * 使用方法:
  6. * php socket.php start # 调试模式启动(前台运行)
  7. * php socket.php start -d # 守护进程模式启动(后台运行)
  8. * php socket.php stop # 停止服务
  9. * php socket.php restart # 重启服务
  10. * php socket.php status # 查看运行状态
  11. */
  12. require __DIR__ . '/vendor/autoload.php';
  13. use Workerman\Worker;
  14. use Workerman\Connection\TcpConnection;
  15. // 日志目录
  16. define('LOG_PATH', __DIR__ . '/runtime/logs/workerman/');
  17. if (!is_dir(LOG_PATH)) {
  18. mkdir(LOG_PATH, 0755, true);
  19. }
  20. // 创建 WebSocket 服务
  21. $ws_worker = new Worker('websocket://0.0.0.0:2345');
  22. // 设置进程名称
  23. $ws_worker->name = 'ChatWebSocket';
  24. // 设置进程数
  25. $ws_worker->count = 4;
  26. // 设置心跳(60秒无响应则断开)
  27. $ws_worker->pingInterval = 60;
  28. $ws_worker->pingNotResponseLimit = 1;
  29. // 当进程启动时
  30. $ws_worker->onWorkerStart = function($worker) {
  31. echo "[Worker #{$worker->id}] started\n";
  32. // 初始化 ChatService
  33. $chatService = new \app\services\workerman\chat\ChatService($worker);
  34. $worker->chatService = $chatService;
  35. };
  36. // 当客户端连接时
  37. $ws_worker->onConnect = function(TcpConnection $connection) {
  38. $addr = $connection->getRemoteAddress();
  39. echo "[Connect] {$addr}\n";
  40. };
  41. // 当收到客户端消息时
  42. $ws_worker->onMessage = function(TcpConnection $connection, $data) use (&$chatService) {
  43. $chatService->onMessage($connection, $data);
  44. };
  45. // 当客户端断开连接时
  46. $ws_worker->onClose = function(TcpConnection $connection) use (&$chatService) {
  47. $chatService->onClose($connection);
  48. };
  49. // 当连接出错时
  50. $ws_worker->onError = function(TcpConnection $connection, $code, $msg) {
  51. echo "[Error] {$code}: {$msg}\n";
  52. };
  53. // 输出启动信息
  54. echo "\n";
  55. echo "========================================\n";
  56. echo " Chat WebSocket Server\n";
  57. echo " Address: ws://0.0.0.0:2345\n";
  58. echo " PID: " . getmypid() . "\n";
  59. echo "========================================\n\n";
  60. // 运行
  61. Worker::runAll();