php 服务端主动向客户端推送消息, php swoole websocket, 服务端向客户端推送消息, websocket主动推送消息

php + swoole 实现服务端主动推送消息

教学视频分享: http://zixueit.cn/  点击链接搜索  Swoole入门到实战

swoole: 完美的实现了PHP的异步、并行、高性能网络通信引擎,支持TCP长连接,Websocket,Mqtt等协议,再开发过程中,当我们需要一套自己的销售系统的时候难以避免的就是消息推送,不多哔哔直接干

项目场景:公司开发的管理后台,将销售人员纳入管理系统当中,将收集的意向用户的信息分发给销售人员,分发后需要即时向销售人员发送通知

使用到swoole函数

server->on  swoole回调函数

onopen()  打开

onmessage()  消息函数,接收客户端消息后触发  必选函数

onclose()   关闭

start()    初始化
借助以上几个函数,并结合数据、业务逻辑即可实现服务端向客户端的消息推送以下为简单的demo仅供参考
demo效果图
<?php
#!/www/server/php/72/bin/php -q
class init{
  
  public $db;
  public $ws;
  public $link;
  public function __construct(){
  $this->ws = new Swoole\WebSocket\Server("0.0.0.0", 9502);    实例化websocket的类  并且连接我们的开放给swoole的端口
  $this->ws->on('open', function ($ws, $request) {
  
  $this->link = $ws->getClientInfo($request->fd);
  $this->message($request->fd);
  此处调用自定义的方法取出数据库中的要发送的数据
  });
  $this->ws->on('message', function ($ws, $frame) {

  });
  //监听 WebSocket 连接关闭事件
  $this->ws->on('close', function ($ws, $fd) {
  # echo "client-{$fd} is closed\n";
  });
  $this->ws->start();

  }
  以上的函数上面有提到,具体含义可以在文章头部的分享连接中找到
 
  public function message($fd)  该方法为自定义方法,目的在于取出数据库中的要发送的数据推送给客户端
  {
    $service = $this->ws;
    $db = new PDO('mysql:host=自己的ip地址;dbname=数据库名', '数据库用户名', '密码');
    $sql = "select title, created_at,id from 表名 where (`news_status` = 0 and `receive_id` = 1) or `is_all` = 1 order by `news_rank` asc, `created_at` desc";
    $array = $db->query($sql);
    foreach($array as $k=>$v)
    {
      $data[$k]['title'] = $v['title'];
      $data[$k]['crated_at'] = $v['created_at'];
      $data[$k]['id'] = $v['id'];
    }
    $data = json_encode($data);
    $this->ws->tick(15000, function() use ($service, $fd, $data){
    #$data = Array('自古英雄多寂寥','我言秋日胜春朝','晴空一鹤排云上','便引诗情到碧霄','道可道非常道','名可名非常名','啦啦啦啦啦啦','啊啊啊啊啊啊','小黑屋');
    #$service->push($fd, "server: ".$data[array_rand($data)]);
    $service->push($fd, $data);
 });
}
}
  new init();
以上就是服务端的代码,具体的含义因个人理解不够深刻不逐步解释以免误导大家,大家可以参考上面的分享连接,进行下载教程
服务端代码编辑好后我们看下客户端代码,简单的令人发指

var wsServer = 'ws://IP地址+端口;
//调用 websocket 对象建立连接:
//参数:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen 监听连接打开
websocket.onopen = function (evt) {
//websocket.readyState 属性:
console.log(evt)
console.log(websocket.readyState);
};

function sending() {
var text = document.getElementById('text').value;
document.getElementById('text').value = '';
//向服务器发送数据
websocket.send(text);
}
//监听连接关闭
websocket.onclose = function (evt) {
msg.innerHTML+="Disconnected<br>";
};

//onmessage 监听服务器数据推送
websocket.onmessage = function (evt) {
fordata(evt)
};
//监听连接错误信息
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};

客户端展示代码,只是demo逐步注释

最终效果

posted @ 2019-08-19 14:37  从入门到删除数据库  阅读(2556)  评论(1编辑  收藏  举报