欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  php后端及时推送消息给客户端
 
  原理:
 
  1、建立一个websocketWorker,用来维持客户端长连接
 
  2、websocketWorker内部建立一个textWorker
 
  3、websocketWorker与textWorker是同一个进程,可以方便的共享客户端连接
 
  4、某个独立的php后台系统通过text协议与textWorker通讯
 
  5、textWorker操作websocket连接完成数据推送
 
  代码及步骤
 
  
 
  
 
  
 
  
 
  
 
  
 
  push.php
 
  <?php
 
  useWorkerman\Worker;
 
  require_once'./Workerman/Autoloader.php';
 
  //初始化一个worker容器,监听1234端口
 
  $worker=newWorker('websocket://0.0.0.0:1234');//
 
  /*
 
  *注意这里进程数必须设置为1,否则会报端口占用错误
 
  *(php7可以设置进程数大于1,前提是$inner_text_worker->reusePort=true)
 
  */
 
  $worker->count=1;
 
  //worker进程启动后创建一个textWorker以便打开一个内部通讯端口
 
  $worker->onWorkerStart=function($worker)
 
  {
 
  //开启一个内部端口,方便内部系统推送数据,Text协议格式文本+换行符
 
  $inner_text_worker=newWorker('text://0.0.0.0:5678');
 
  $inner_text_worker->onMessage=function($connection,$buffer)
 
  {
 
  //$data数组格式,里面有uid,表示向那个uid的页面推送数据
 
  $data=json_decode($buffer,true);
 
  $uid=$data['uid'];
 
  //通过workerman,向uid的页面推送数据
 
  $ret=sendMessageByUid($uid,$buffer);
 
  //返回推送结果
 
  $connection->send($ret?'ok':'fail');
 
  };
 
  //##执行监听##
 
  $inner_text_worker->listen();
 
  };
 
  //新增加一个属性,用来保存uid到connection的映射
 
  $worker->uidConnections=array();
 
  //当有客户端发来消息时执行的回调函数
 
  $worker->onMessage=function($connection,$data)
 
  {
 
  global$worker;
 
  //判断当前客户端是否已经验证,既是否设置了uid
 
  if(!isset($connection->uid))
 
  {
 
  //没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
 
  $connection->uid=$data;
 
  /*保存uid到connection的映射,这样可以方便的通过uid查找connection,
 
  *实现针对特定uid推送数据
 
  */
 
  $worker->uidConnections[$connection->uid]=$connection;
 
  return;
 
  }
 
  };
 
  //当有客户端连接断开时
 
  $worker->onClose=function($connection)
 
  {
 
  global$worker;
 
  if(isset($connection->uid))
 
  {
 
  //连接断开时删除映射
 
  unset($worker->uidConnections[$connection->uid]);
 
  }
 
  };
 
  //向所有验证的用户推送数据
 
  functionbroadcast($message)
 
  {
 
  global$worker;
 
  foreach($worker->uidConnectionsas$connection)
 
  {
 
  $connection->send($message);
 
  }
 
  }
 
  //针对uid推送数据
 
  functionsendMessageByUid($uid,$message)
 
  {
 
  global$worker;
 
  if(isset($worker->uidConnections[$uid]))
 
  {
 
  $connection=$worker->uidConnections[$uid];
 
  $connection->send($message);
 
  returntrue;
 
  }
 
  returnfalse;
 
  }
 
  //运行所有的worker
 
  Worker::runAll();
 
  启动后端服务phppush.phpstart-d
 
  前端接收推送的js代码
 
  varws=newWebSocket('ws://127.0.0.1:1234');
 
  ws.onopen=function(){
 
  varuid='uid1';
 
  ws.send(uid);
 
  };
 
  ws.onmessage=function(e){
 
  alert(e.data);
 
  };
 
  后端推送消息的代码
 
  //建立socket连接到内部推送端口
 
  $client=stream_socket_client('tcp://127.0.0.1:5678',$errno,$errmsg,1);
 
  //推送的数据,包含uid字段,表示是给这个uid推送
 
  $data=array('uid'=>'uid1','percent'=>'88%');
 
  //发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
 
  fwrite($client,json_encode($data)."\n");
 
  //读取推送结果
 
  echofread($client,8192);
 
  后端推送消息的代码和push.php监听同一个端口
 
  push.php和前端监听同一个websocket端口
 
  通过后端推送消息的代码向push.php推送数据,
 
  push.php接受到数据后通过处理利用websocket往前端推送数据






本文转载自中文网

 

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h55910.shtml