params['socket_port']); self::$server->on('open', [$this, 'open']); //监听WebSocket消息事件 self::$server->on('message', [$this, 'message']); //监听WebSocket连接关闭事件 self::$server->on('close', [$this, 'close']); //sorker self::$server->on('WorkerStart', [$this, 'onWorkerStart']); self::$server->on('WorkerStop', [$this, 'onWorkerStop']); //task self::$server->on('Task', [$this, 'onTask']); self::$server->on('Finish', [$this, 'onTaskFinish']); self::$server->set([ 'log_file' => 'runtime/logs/swoole.log', 'task_worker_num' => 10, 'log_level' => 0, 'daemonize' => 0, ]); //添加tick轮训令牌 self::$redis = new Redis(); self::$redis->connect(self::$app->params['redis_server'],self::$app->params['redis_port']); self::$redis->lpush(RedisKeyUtil::serverTick(), 1); self::$server->start(); } /** * 客户链接 * @param swoole_websocket_server $server * @param swoole_http_request $request */ public function open(swoole_websocket_server $server, swoole_http_request $request) { SocketCommUtil::log('连接', $request->fd, null); } /** * 消息 * @param swoole_websocket_server $server * @param swoole_websocket_frame $frame */ public function message(swoole_websocket_server $server, swoole_websocket_frame $frame) { SocketCommUtil::log('接收消息', $frame->fd, $frame->data); $data = json_decode($frame->data, true); if (empty($data)) return; $data['fd'] = $frame->fd; try { self::$app->runAction('client-message/message', [$data]); } catch (Exception $e) { ClientMessageUtil::SendClientMessage($frame->fd, SocketEnum::COMMAND_ERROR_R, 0, $e->getMessage()); } } /** * 关闭链接 * @param swoole_websocket_server $server * @param $fd */ public function close(swoole_websocket_server $server, $fd) { SocketCommUtil::log('连接关闭', $fd); ClientMessageUtil::clearCloseClient($fd); } /** * Worker * @param swoole_server $server * @param $worker_id */ public function onWorkerStart(swoole_server $server, $worker_id) { //取轮训令牌 $key = self::$redis->rpop(RedisKeyUtil::serverTick()); if (!empty($key)) { SwooleYiiApp::$serverTickWorkerID = $worker_id; //开启web服务器消息检查 $server->tick(self::$app->params['socket_web_server_message_tick_time'], function () { ServerTickController::sendServerMessage(); }); //开启web服务器消息检查 $server->tick(self::$app->params['socket_broadcast_message_tick_time'], function () { ServerTickController::tickBroadcastMessage(); }); } } public function onWorkerStop(swoole_server $server, $worker_id) { if (SwooleYiiApp::$serverTickWorkerID == $worker_id) { SwooleYiiApp::$serverTickWorkerID = -1; //归还轮训令牌 self::$app->redis->lpush(RedisKeyUtil::serverTick(), 1); } } /**Task * @param swoole_server $serv * @param $task_id * @param $src_worker_id * @param $data */ function onTask(swoole_server $serv, $task_id, $src_worker_id, $data) { if ($data == SocketEnum::TASK_ALL_BROADCAST_MESSAGE) { ServerTickController::broadcastMessage(); } } function onTaskFinish(swoole_server $serv, $task_id, $data) { } } new SwooleYiiApp();