优化更新
This commit is contained in:
@@ -58,7 +58,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
|
||||
// 用户认证
|
||||
if (!$userId || !$token) {
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '认证失败:缺少 user_id 或 token',
|
||||
@@ -82,7 +82,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
'query_user_id' => $userId
|
||||
]);
|
||||
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '认证失败:用户 ID 不匹配',
|
||||
@@ -102,7 +102,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
'current_time' => time()
|
||||
]);
|
||||
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '认证失败:token 已过期',
|
||||
@@ -124,7 +124,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '认证失败:无效的 token',
|
||||
@@ -148,7 +148,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
]);
|
||||
|
||||
// 发送欢迎消息
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'connected',
|
||||
'data' => [
|
||||
'message' => '欢迎连接到 LaravelS WebSocket',
|
||||
@@ -170,7 +170,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
'fd' => $request->fd
|
||||
]);
|
||||
|
||||
$server->push($request->fd, json_encode([
|
||||
$this->safePush($server, $request->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '连接错误:' . $e->getMessage(),
|
||||
@@ -181,6 +181,30 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全的推送消息(检查连接是否建立)
|
||||
*
|
||||
* @param Server $server WebSocket 服务器对象
|
||||
* @param int $fd 文件描述符
|
||||
* @param string $data 要发送的数据
|
||||
* @return bool 是否发送成功
|
||||
*/
|
||||
protected function safePush(Server $server, int $fd, string $data): bool
|
||||
{
|
||||
try {
|
||||
if ($server->isEstablished($fd)) {
|
||||
return $server->push($fd, $data);
|
||||
}
|
||||
return false;
|
||||
} catch (\Exception $e) {
|
||||
Log::warning('WebSocket push 失败', [
|
||||
'fd' => $fd,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理接收消息事件
|
||||
*
|
||||
@@ -207,7 +231,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$message = json_decode($frame->data, true);
|
||||
|
||||
if (!$message || !isset($message['type'])) {
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '无效的消息格式',
|
||||
@@ -230,7 +254,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
switch ($type) {
|
||||
case 'ping':
|
||||
// 响应 ping
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'pong',
|
||||
'data' => $data
|
||||
]));
|
||||
@@ -238,7 +262,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
|
||||
case 'heartbeat':
|
||||
// 心跳确认
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'heartbeat_ack',
|
||||
'data' => array_merge($data, [
|
||||
'timestamp' => time()
|
||||
@@ -268,7 +292,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
|
||||
default:
|
||||
// 未知消息类型
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '未知的消息类型:' . $type,
|
||||
@@ -345,7 +369,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$toUserId = $data['to_user_id'] ?? 0;
|
||||
|
||||
if (!$toUserId) {
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '缺少 to_user_id',
|
||||
@@ -359,7 +383,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$recipientInfo = $wsTable->get('uid:' . $toUserId);
|
||||
|
||||
if ($recipientInfo === false) {
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '用户不在线',
|
||||
@@ -373,7 +397,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$toFd = (int)$recipientInfo['value'];
|
||||
|
||||
// 发送消息给接收者
|
||||
$server->push($toFd, json_encode([
|
||||
$this->safePush($server, $toFd, json_encode([
|
||||
'type' => 'chat',
|
||||
'data' => array_merge($data, [
|
||||
'from_user_id' => $fromUserId,
|
||||
@@ -413,9 +437,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($server->isEstablished($fd)) {
|
||||
$server->push($fd, $message);
|
||||
}
|
||||
$this->safePush($server, $fd, $message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -435,7 +457,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$channel = $data['channel'] ?? '';
|
||||
|
||||
if (!$channel) {
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '缺少频道名称',
|
||||
@@ -452,7 +474,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
'expiry' => time() + 3600
|
||||
]);
|
||||
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'subscribed',
|
||||
'data' => [
|
||||
'channel' => $channel,
|
||||
@@ -483,7 +505,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$channel = $data['channel'] ?? '';
|
||||
|
||||
if (!$channel) {
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'message' => '缺少频道名称',
|
||||
@@ -497,7 +519,7 @@ class WebSocketHandler implements WebSocketHandlerInterface
|
||||
$channelKey = 'channel:' . $channel . ':fd:' . $frame->fd;
|
||||
$wsTable->del($channelKey);
|
||||
|
||||
$server->push($frame->fd, json_encode([
|
||||
$this->safePush($server, $frame->fd, json_encode([
|
||||
'type' => 'unsubscribed',
|
||||
'data' => [
|
||||
'channel' => $channel,
|
||||
|
||||
Reference in New Issue
Block a user