Workerman如何实现消息推送功能开发

浅静同学_8551

浅静同学_8551

2026-06-28

149人浏览

原创

必须建立 client_id 到 connection 的可复用映射关系以实现精准推送;客户端首次连接需发送 bind 消息绑定 id;服务端通过 self::$client_map 索引并维护映射,onclose 时及时清理,否则导致消息错发或丢失。

workerman如何实现消息推送功能开发

要在 PHP 项目中实现基于客户端 ID 的精准消息推送,必须绕过 Workerman 默认的 connection_id 临时性缺陷,建立业务侧可识别、可复用的 ID 映射关系。直接调用 $connection->send() 向所有连接广播是无效的,因为目标用户可能不在线、连接已断开或未完成身份绑定。

初始化 WebSocket 服务并启用 WSS

使用 websocket://0.0.0.0:8282 启动服务,若需 HTTPS 加密通信(如微信小程序、H5 页面强制要求),必须配置 SSL 证书路径并改用 wss:// 协议。Workerman 不内置 HTTPS 支持,需通过 Nginx 反向代理或在 Worker 构造时传入 SSL 上下文参数。

执行命令启动服务:php start.php start -d。确保防火墙及云服务器安全组已放行 8282 端口。

【必须确认证书路径正确且私钥无密码,否则 WSS 握手失败,前端报错 net::ERR_CONNECTION_CLOSED】

客户端连接后绑定自定义 ID

客户端首次连接成功,立即发送 JSON 消息绑定业务 ID:

{"type":"bind","client_id":"user_10086"}

服务端在 onMessage 中解析该消息,检查 $data['type'] === 'bind' 后执行三步操作:

① 若该 client_id 已存在映射,先从 self::$client_map 中移除旧连接,避免多端登录冲突导致消息错发;

② 将当前 $connection 实例写入 self::$client_map[$client_id] = $connection;

③ 同时为连接对象挂载属性 $connection->client_id = $client_id,便于后续 onClose 或心跳检测时反查。

这一步不做绑定,后续任何 push 请求都无法定位目标连接——self::$client_map 是整个精准推送逻辑的唯一索引表。

后台触发单点精准推送

方法一:HTTP 接口触发(推荐用于管理后台)

Pixie.haus
Pixie.haus

一款面向像素艺术创作的AI图像生成平台,帮助用户快速制作像素风格图片和适合游戏等项目使用的视觉素材。

下载

提供一个普通 PHP 脚本(如 push_api.php),接收 GET 参数:?target_id=user_10086&content=订单已支付;

脚本内直接读取 Events::$client_map['user_10086'],若存在则调用 $connection->send(json_encode(['msg'=>$content]));

若不存在,说明目标用户未在线或未完成 bind,不报错也不重试——这是业务层应处理的离线逻辑。

方法二:内部 TCP 文本协议推送(适合高并发指令流)

另起一个 text://0.0.0.0:5678 内部监听 Worker,接收格式为 {"target_id":"user_10086","content":"系统通知"} 的纯文本;

解析后走同一条映射查找路径,成功即发,失败即丢弃;

【严禁在此处尝试重连或队列持久化——Workerman 进程内无共享内存,无法跨进程访问 $client_map】

连接异常时自动清理映射

第一步:在 onClose 回调中遍历 self::$client_map,比对每个 value 是否等于当前关闭的 $connection;

第二步:一旦匹配,用 array_keys(self::$client_map, $connection)[0] 取出 key,再执行 unset(self::$client_map[$key]);

第三步:同时清除连接对象上的 $connection->client_id 属性(可选,防内存泄漏);

这一步漏掉会导致映射表持续膨胀,相同 client_id 多次登录后只保留最后一次连接,历史连接仍占位却无法通信,最终出现「明明在线却收不到消息」的故障。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10104

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5981

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3748

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4454

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3491

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4977

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3902

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11862

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习