首先要说明一下,实时推送是有两个socket服务端和两个socket的客户端
我们分别起名叫做
外层服务端 (开启服务主进程 创建一个 websoket 连接)ws://
内层服务端 (在开户主进程的时候,内部又创建的一个 socket)text://
外层客户端 (这是由前端的用户端 使用js 创建的一个 websocket 客户端)
内层客户端 (这是php 使用 stream_socket_client 创建的一个客户端)
上代码(说明在代码的注释中)
服务端代码 (websocket 的创建)
- 安装 workerman (因为使用的是 tp框架,所以安装的 topthink/think-worker ,它已经包含了 workerman)
composer install topthink/think-worker
这个服务端是一个 挂起的操作, 所以不需要过 tp 的入口文件,直接使用 php 命令行运行就可以了
本人在 app\worker\Testworker.php 新建了这个服务端的文件
require __DIR__ . '/../../vendor/autoload.php'; //因为是独立运行的,所以要引入 autoload.php
use Workerman\Worker;
$worker = new Worker("websocket://0.0.0.0:2345"); //创建了一个 websocket 的服务端,端口是 2345 (记得打开阿里云 或 宝塔的 2345端口)
$worker->count=1; //count属性windows中的配置就写1 linux中可以配多个$worker->uidConnections = []; //自定义了一个空数组,用来存放所有的 连接对象//当连接成功时
$worker->onConnect = function($connection){dump($connection);//这里只是显示一下连接是否成功,没有什么作用
};//workerman 收到消息时的监听,前端可能发过来不同种类的消息,所以消息上都带有type字段,根据 type 类型的不同做相应的处理
//参数 $connection 表示 这个 websocket连接的资源操作符 是一个非常有用的数据后续我们是在保存起来的
//参数 $msg 就是前端发过来的数据 格式是 {type:"bind",uid:1},自已定义就可以了 我这里bind就是绑定用户的意思
$worker->onMessage = function($connection,$msg) use ($worker){$msg = json_decode($msg,true);if($msg["type"] == "bind"){//如果前端传来的消息类型是 bind 就是绑定用户的消息类型if(!isset($connection->uid)){$connection->uid<