业务场景需要使用 HTTPS

一、需求

基于 web-msg-sender 进行实时消息的推送

web-msg-sender 是基于 PHPSocket.io 开发的,而 PHPSocket.io 是基于 workerman 开发的。

之前我写过一篇文章,实现多人在线分组聊天,是使用 gateway-worker 实现的。

workerman 是我使用的比较多的socket开发框架,非常好用。

web-msg-sender 是作者在 PHPSocket.io 的基础上开发出来的应用,非常方便实用,:

二、解决

1、主要的业务逻辑是:

1) 开启一个端口监听 socket,供客户端链接和消息的转发

2) 开启一个Worker,用于内部请求

3) 需要发送消息,通过PHP请求 Worker

4) 客户端通过 socket.io.js 连接 socket

2、安装 web-msg-sender

安装需要下面几步:

  1. git clone https://github.com/walkor/web-msg-sender
  2. composer install

安装完之后会生成一个 web-msg-sender 文件夹,然后进入文件夹,安装 phpsocket.io

  1. composer require workerman/phpsocket.io

安装完之后即可使用。

3、文件结构说明

下载下来的文件夹目录如下:

1.jpg

  • vendor 是composer require 安装的
  • web 是用于演示的 web 服务文件
  • start.php 是一个整合的开启脚本,会开启 socket 和 web 两个服务

    • web 服务的 documentRoot 就是 第二点的 web目录
    • 其实就是运行 start_io.php 和 start_web.php
    • 实际开发 只需要 start_io.php 其他两个不需要
  • start_io.php
  • start_web.php

4、开启

直接php脚本运行就行(实际过程只需要start_io.php):

php star.php start

开启之后就能通过url进行推送,开启时默认开启三个服务:

  • socket 监听 2120
  • Worker 监听 2121
  • web 监听 2123

如果要进行推送,直接访问 : http://127.0.0.1:2121 注意得是 2121 的 Worker 端口

访问 http://127.0.0.1:2123 查看的是自带的web服务

客户端需要使用 socket.io.js 连接 127.0.0.1:2120

更多的可以查看 web-msg-sender 推送的文档:

三、代码

1、开启 socket 端口和 Worker

编辑 start_io.php

// PHPSocketIO服务 
// 这里修改 Socket 的 端口
$sender_io = new SocketIO(2120,$context);
// Worker开启的是http协议的端口 
// 这个是推送的时候请求的url地址 比如进行推送 则直接访问 http://0.0.0.0:2121?type=publish&content=content 继续推送
$inner_http_worker = new Worker('http://0.0.0.0:2121');  

2、调用URL进行推送

protected function sendMsgToAllByPhpSocketIO($content=''){
    try{
        // 获取推送的url
        $url=Config::get('apiserver.socketUrl');
        // 拼接消息体
        $contentJson=[
            'type'=>'publish',
            'content'=>$content,
        ];
        // 向所有在线的用户进行推送
        return curl_post($url,[],$contentJson);
    }catch (\Exception $exception){
        dump($exception->getMessage());
        return false;
    }
}

支持post和get两种方式,使用的请求方式是 CURL

我之前写过一个 Model ,用来封装curl的请求 地址:

3、客户端连接和监听事件

使用 socket.io.js : <script src='https://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>

try{
     $(document).ready(function(){
     // 开启一个新页面的时候重置变量 commonOrderlist

     // 初始化io对象
      var socket = io('https://xxxxxx.com:2120',{"reconnection":false});
      // uid 可以为网站用户的uid,作为例子这里用session_id代替
      var uid = '<?php echo session_id();?>';
      // 当socket连接后发送登录请求
      socket.on('connect', function(){socket.emit('login', uid);});
      // 当服务端推送来消息时触发,这里简单的aler出来,用户可做成自己的展示效果
      socket.on('login_result',function(msg){ // 这是我修改之后的处理方式
          if(msg!=1){
              // 提示监听异常
              alert('监听异常');
          }
      });
      socket.on('new_msg', function(msg){
         // 当收到推送来的消息进行处理
         console.log(msg)
      });
     });
  }catch (err){
      alert('监听异常');
  }

4、定制

如果需要定制消息的推送以及消息的接收等字段,需要修改的文件是:

start_io.php