介绍
小编给大家分享一下WorkerMan中php后端及时推送消息给客户端的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
php后端及时推送消息给客户端
原理:
1,建立一个websocket工人,用来维持客户端长连接
2, websocket工人内部建立一个文字工作者
3, websocket职工与文本职工是同一个进程,可以方便的共享客户端连接
4,某个独立的php后台系统通过文本协议与文本工人通讯
5,文本工人操作websocket连接完成数据推送
代码及步骤
push.php , php & lt; ? use Workerman \工人; require_once & # 39;。/Workerman Autoloader.php& # 39;;//,初始化一个工人容器,监听1234端口 $ worker =, new 工人(& # 39;websocket://0.0.0.0:1234& # 39;);//,/* ,*注意这里进程数必须设置为1,否则会报端口占用错误 7,* (php 可以设置进程数大于1,前提是美元inner_text_worker→reusePort=true) ,*/工人→美元count =, 1;//,工人进程启动后创建一个text 工人以便打开一个内部通讯端口 工人→美元onWorkerStart =,函数(工人)美元 { ,,,//,开启一个内部端口,方便内部系统推送数据,文本协议格式,文本+换行符 ,,,inner_text_worker 美元;=,new 工人(& # 39;文本://0.0.0.0:5678& # 39;); ,,,美元inner_text_worker→onMessage =,函数(连接,美元,美元缓冲区) ,,,{ ,,,,,,,//,$ data数组格式,里面有uid,表示向那个uid的页面推送数据 ,,,,,,,data 美元;=,json_decode(缓冲美元,,真的); ,,,,,,,uid 美元;=,$ data [& # 39; uid # 39;]; ,,,,,,,//,通过workerman,向uid的页面推送数据 ,,,,,,,ret 美元;=,sendMessageByUid (uid美元,,缓冲); ,,,,,,,//,返回推送结果 ,,,,,,,连接→美元发送(ret 美元;?,& # 39;好# 39;,:,& # 39;失败# 39;); ,,,}; ,,,//,# #,执行监听,# # ,,,美元inner_text_worker→听(); };//,新增加一个属性,用来保存uid到连接的映射 工人→美元uidConnections =,数组();//,当有客户端发来消息时执行的回调函数 时间=美元工人→onMessage 函数(连接美元,,数据) { ,,,global $工人; ,,,//,判断当前客户端是否已经验证,既是否设置了uid ,,,如果(!收取(连接→美元uid)) ,,,{ ,,,,,,//,没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证) ,,,,,,连接→美元uid =,元数据; ,,,,,,/*,保存uid到连接的映射,这样可以方便的通过uid查找连接, ,,,,,,,*,实现针对特定uid推送数据 ,,,,,,*/,,,,,,工人→美元uidConnections(连接→美元uid),=,美元连接; ,,,,,,返回; ,,,} }; ,//,当有客户端连接断开时 时间=美元工人→onClose 函数(连接) { ,,,global $工人; ,,,如果(收取(连接→美元uid)) ,,,{ ,,,,,,,//,连接断开时删除映射 ,,,,,,,设置(工人→美元uidConnections[连接→美元uid]); ,,,} }; ,//,向所有验证的用户推送数据 function 广播(消息) { 美元,才能global 工人; ,,foreach($工人→uidConnections as 美元连接) ,,{ ,,,,,,,连接→美元发送消息($); ,,} } ,//,针对uid推送数据 function sendMessageByUid (uid美元,美元消息) { ,,,global $工人; ,,,如果(收取(工人→美元uidConnections [$ uid])) ,,,{ ,,,,,,,connection 美元;=,工人→美元uidConnections (uid美元); ,,,,,,,连接→美元发送消息($); ,,,,,,,return 真实; ,,,} ,,,return 假; } ,//,运行所有的工人 工人:runAll (); 启动后端服务,php push.php start - d , 前端接收推送的js代码 , var ws =, new WebSocket (& # 39; ws://127.0.0.1:1234& # 39;); 时间=ws.onopen 函数(){ ,,,var uid =, & # 39; uid1& # 39;; ,,,ws.send (uid); }; 时间=ws.onmessage 函数(e) { ,,,警报(e.data); }; 后端推送消息的代码 ,//,建立插座连接到内部推送端口 $ client =, stream_socket_client (& # 39; tcp://127.0.0.1:5678& # 39;,, errno美元,errmsg美元,1);//,推送的数据,包含uid字段,表示是给这个uid推送 data 美元;=,阵列(& # 39;uid # 39;=祝辞& # 39;uid1& # 39;,, & # 39; % # 39;=祝辞& # 39;& # 39;88%);//,发送数据,注意5678端口是文本协议的端口,文本协议需要在数据末尾加上换行符 写入文件(客户端,美元,json_encode(元数据)干净\ n");//,读取推送结果 nullWorkerMan中php后端及时推送消息给客户端的案例