| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- <?php
- /**
- * WebSocket 服务端启动文件
- *
- * 使用方法:
- * php socket.php start # 调试模式启动(前台运行)
- * php socket.php start -d # 守护进程模式启动(后台运行)
- * php socket.php stop # 停止服务
- * php socket.php restart # 重启服务
- * php socket.php status # 查看运行状态
- */
- require __DIR__ . '/vendor/autoload.php';
- use Workerman\Worker;
- use Workerman\Connection\TcpConnection;
- // 日志目录
- define('LOG_PATH', __DIR__ . '/runtime/logs/workerman/');
- if (!is_dir(LOG_PATH)) {
- mkdir(LOG_PATH, 0755, true);
- }
- // 创建 WebSocket 服务
- $ws_worker = new Worker('websocket://0.0.0.0:2345');
- // 设置进程名称
- $ws_worker->name = 'ChatWebSocket';
- // 设置进程数
- $ws_worker->count = 4;
- // 设置心跳(60秒无响应则断开)
- $ws_worker->pingInterval = 60;
- $ws_worker->pingNotResponseLimit = 1;
- // 当进程启动时
- $ws_worker->onWorkerStart = function($worker) {
- echo "[Worker #{$worker->id}] started\n";
-
- // 初始化 ChatService
- $chatService = new \app\services\workerman\chat\ChatService($worker);
- $worker->chatService = $chatService;
- };
- // 当客户端连接时
- $ws_worker->onConnect = function(TcpConnection $connection) {
- $addr = $connection->getRemoteAddress();
- echo "[Connect] {$addr}\n";
- };
- // 当收到客户端消息时
- $ws_worker->onMessage = function(TcpConnection $connection, $data) use (&$chatService) {
- $chatService->onMessage($connection, $data);
- };
- // 当客户端断开连接时
- $ws_worker->onClose = function(TcpConnection $connection) use (&$chatService) {
- $chatService->onClose($connection);
- };
- // 当连接出错时
- $ws_worker->onError = function(TcpConnection $connection, $code, $msg) {
- echo "[Error] {$code}: {$msg}\n";
- };
- // 输出启动信息
- echo "\n";
- echo "========================================\n";
- echo " Chat WebSocket Server\n";
- echo " Address: ws://0.0.0.0:2345\n";
- echo " PID: " . getmypid() . "\n";
- echo "========================================\n\n";
- // 运行
- Worker::runAll();
|