zoukankan      html  css  js  c++  java
  • 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 SwooleWebSocketServer("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 ";
      });
      $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逐步注释

    最终效果

  • 相关阅读:
    呀?这就是锁(二)?
    呀?这就是锁(一)?
    线程的建立
    Mybatis基础使用简介
    使用apache+tomcat+mod_jk.so实现集群
    HttpClient使用详解
    HttpClient基础用法
    Collection集合学习(二)———List接口与具体实现
    Docker学习总结(二)—— 镜像,容器
    Docker学习总结(一)—— namespace,cgroup机制
  • 原文地址:https://www.cnblogs.com/mzli/p/11376951.html
Copyright © 2011-2022 走看看