WorkerMan中php后端及时推送消息给客户端的案例

  介绍

小编给大家分享一下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");//,读取推送结果   null

WorkerMan中php后端及时推送消息给客户端的案例