如何在php后端及时推送消息给客户端

如何在php后端及时推送消息给客户端 


Qyouu
浏览 644回答 1
1回答

繁星点点滴滴

后端代码push.php123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293<?phpuse&nbsp;Workerman\Worker;require_once&nbsp;'./Workerman/Autoloader.php';//&nbsp;初始化一个worker容器,监听1234端口$worker&nbsp;=&nbsp;new&nbsp;Worker('websocket://0.0.0.0:1234');//&nbsp;这里进程数必须设置为1$worker->count&nbsp;=&nbsp;1;//&nbsp;worker进程启动后建立一个内部通讯端口$worker->onWorkerStart&nbsp;=&nbsp;function($worker){&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开启一个内部端口,方便内部系统推送数据,Text协议格式&nbsp;文本+换行符&nbsp;&nbsp;&nbsp;&nbsp;$inner_text_worker&nbsp;=&nbsp;new&nbsp;Worker('Text://0.0.0.0:5678');&nbsp;&nbsp;&nbsp;&nbsp;$inner_text_worker->onMessage&nbsp;=&nbsp;function($connection,&nbsp;$buffer)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;$worker;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;$data数组格式,里面有uid,表示向那个uid的页面推送数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;json_decode($buffer,&nbsp;true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$uid&nbsp;=&nbsp;$data['uid'];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;通过workerman,向uid的页面推送数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ret&nbsp;=&nbsp;sendMessageByUid($uid,&nbsp;$buffer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回推送结果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connection->send($ret&nbsp;?&nbsp;'ok'&nbsp;:&nbsp;'fail');&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;$inner_text_worker->listen();};//&nbsp;新增加一个属性,用来保存uid到connection的映射$worker->uidConnections&nbsp;=&nbsp;array();//&nbsp;当有客户端发来消息时执行的回调函数$worker->onMessage&nbsp;=&nbsp;function($connection,&nbsp;$data)use($worker){&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断当前客户端是否已经验证,既是否设置了uid&nbsp;&nbsp;&nbsp;&nbsp;if(!isset($connection->uid))&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connection->uid&nbsp;=&nbsp;$data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;保存uid到connection的映射,这样可以方便的通过uid查找connection,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现针对特定uid推送数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$worker->uidConnections[$connection->uid]&nbsp;=&nbsp;$connection;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;}};&nbsp;//&nbsp;当有客户端连接断开时$worker->onClose&nbsp;=&nbsp;function($connection)use($worker){&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;$worker;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($connection->uid))&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;连接断开时删除映射&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($worker->uidConnections[$connection->uid]);&nbsp;&nbsp;&nbsp;&nbsp;}};&nbsp;//&nbsp;向所有验证的用户推送数据function&nbsp;broadcast($message){&nbsp;&nbsp;&nbsp;global&nbsp;$worker;&nbsp;&nbsp;&nbsp;foreach($worker->uidConnections&nbsp;as&nbsp;$connection)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connection->send($message);&nbsp;&nbsp;&nbsp;}}&nbsp;//&nbsp;针对uid推送数据function&nbsp;sendMessageByUid($uid,&nbsp;$message){&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;$worker;&nbsp;&nbsp;&nbsp;&nbsp;if(isset($worker->uidConnections[$uid]))&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connection&nbsp;=&nbsp;$worker->uidConnections[$uid];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connection->send($message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}&nbsp;//&nbsp;运行所有的worker(其实当前只定义了一个)Worker::runAll();&nbsp;&nbsp;启动后端服务php&nbsp;push.php&nbsp;start&nbsp;-d&nbsp;前端接收推送的js代码var&nbsp;ws&nbsp;=&nbsp;new&nbsp;WebSocket('ws://127.0.0.1:1234');ws.onopen&nbsp;=&nbsp;function(){&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;uid&nbsp;=&nbsp;'uid1';&nbsp;&nbsp;&nbsp;&nbsp;ws.send(uid);};ws.onmessage&nbsp;=&nbsp;function(e){&nbsp;&nbsp;&nbsp;&nbsp;alert(e.data);};后端推送消息的代码12345678//&nbsp;建立socket连接到内部推送端口$client&nbsp;=&nbsp;stream_socket_client('tcp://127.0.0.1:5678',&nbsp;$errno,&nbsp;$errmsg,&nbsp;1,&nbsp;&nbsp;STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);//&nbsp;推送的数据,包含uid字段,表示是给这个uid推送$data&nbsp;=&nbsp;array('uid'=>'uid1',&nbsp;'percent'=>'88%');//&nbsp;发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符fwrite($client,&nbsp;json_encode($data)."\n");//&nbsp;读取推送结果echo&nbsp;fread($client,&nbsp;8192);这里的uid不一定是用户的id,也可以理解为任务id即 taskid以上代码亲测可以直接使用&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP