gatewayworker要求推送消息必须是含type字段的合法json字符串,如{"type":"chat","content":"你好"};tp5.1中需用json_encode拼接或gateway::sendtoclient传数组(自动编码),sendtouid则必须传已编码字符串;前端须用json.parse解析。

PHP框架需要把业务数据组装成标准格式发给GatewayWorker,再由GatewayWorker推送给前端WebSocket连接,这个拼接过程必须严格遵循协议结构,否则前端收不到或解析失败。
确认消息结构规范
GatewayWorker不处理业务逻辑,只负责转发。它要求所有推送消息必须是合法JSON字符串,且必须包含type字段——这是前端onmessage里switch判断的唯一依据。
例如:{"type":"chat","to_client_id":"abc123","content":"你好","timestamp":1723405821}。
【type字段不可省略,且值必须是字符串,不能为null或数字】
若漏掉type,前端switch会进入default分支,无法触发对应业务逻辑。
ThinkPHP5.1中拼接消息的两种方法
方法一:手动拼接数组→json_encode
在控制器中构造关联数组,调用json_encode前必须确保所有键名小写、无中文空格、无非法字符:
$data = ['type' => 'notify', 'title' => '订单已支付', 'order_no' => $orderNo, 'uid' => $uid];
Gateway::sendToClient($clientId, json_encode($data, JSON_UNESCAPED_UNICODE));
方法二:使用GatewayClient封装的send方法(推荐)
先引入use GatewayClient\Gateway;,再直接传数组:
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
Gateway::sendToClient($clientId, ['type'=>'system','msg'=>'服务升级中','level'=>2]);
GatewayClient内部自动调用json_encode,且默认启用JSON_UNESCAPED_UNICODE,避免中文变\u编码。
向指定用户群组推送消息
第一步:确定目标标识方式
GatewayWorker支持按client_id、group、uid三种方式推送。TP5.1项目中通常用uid绑定client_id,所以优先走uid路径。
第二步:查出目标uid列表
从数据库读取当前在线客服人员的uid数组,例如[1001, 1002, 1003]。
第三步:拼接并批量推送
调用Gateway::sendToUid()时,第二个参数必须是完整JSON字符串,不能传数组:
$msg = json_encode(['type'=>'assign','task_id'=>567,'from_uid'=>888], JSON_UNESCAPED_UNICODE);
Gateway::sendToUid($uids, $msg);
【sendToUid方法不接受数组,只接受已encode好的字符串,传数组会静默失败】
前端接收后如何解包
JavaScript端收到的是原始字符串,必须用JSON.parse解析:
ws.onmessage = function(e) {
try {
const data = JSON.parse(e.data);
if (data.type === 'chat') { renderChat(data); }
} catch(err) { console.error('JSON parse failed:', e.data); }
};
如果后端拼接时用了html_entity_decode或stripslashes等操作,可能导致引号转义异常,前端parse会报错。务必保证后端输出是纯净JSON。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










