WorkerMan中php后端及时推送消息给客户端

发布时间 - 2020-02-08 00:00:00    点击率:

php后端及时推送消息给客户端

原理:

1、建立一个websocket Worker,用来维持客户端长连接 

2、websocket Worker内部建立一个text Worker 

3、websocket Worker 与 text Worker是同一个进程,可以方便的共享客户端连接

4、某个独立的php后台系统通过text协议与text Worker通讯

5、text Worker操作websocket连接完成数据推送

代码及步骤

push.php
 
reusePort=true)
 */
$worker->count = 1;
// worker进程启动后创建一个text Worker以便打开一个内部通讯端口
$worker->onWorkerStart = function($worker)
{
    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    $inner_text_worker = new Worker('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]);
    }
};
 
// 向所有验证的用户推送数据
function broadcast($message)
{
   global $worker;
   foreach($worker->uidConnections as $connection)
   {
        $connection->send($message);
   }
}
 
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
    global $worker;
    if(isset($worker->uidConnections[$uid]))
    {
        $connection = $worker->uidConnections[$uid];
        $connection->send($message);
        return true;
    }
    return false;
}
 
// 运行所有的worker
Worker::runAll();
启动后端服务 php push.php start -d
 
前端接收推送的js代码
 
var ws = new WebSocket('ws://127.0.0.1:1234');
ws.onopen = function(){
    var uid = '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");
// 读取推送结果
echo fread($client, 8192);

后端推送消息的代码和push.php监听同一个端口

push.php和前端监听同一个websocket端口

通过后端推送消息的代码向push.php推送数据,

push.php接受到数据后通过处理 利用websocket往前端推送数据

更多workerman知识请关注PHP中文网workerman框架教程栏目。


# workerman  # 客户端  # 后端  # 会报  # 建立一个  # 第一个  # 换行符  # 中文网  # 设置为  # 连接到  # 创建一个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何实现事件和监听器?(Event & Listener实战)  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  LinuxShell函数封装方法_脚本复用设计思路【教程】  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel怎么清理缓存_Laravel optimize clear命令详解  Swift开发中switch语句值绑定模式  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel如何使用Telescope进行调试?(安装和使用教程)  linux top下的 minerd 木马清除方法  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Android利用动画实现背景逐渐变暗  Laravel如何创建自定义中间件?(Middleware代码示例)  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何在建站之星绑定自定义域名?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Python高阶函数应用_函数作为参数说明【指导】  canvas 画布在主流浏览器中的尺寸限制详细介绍  香港服务器网站推广:SEO优化与外贸独立站搭建策略  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  公司网站制作价格怎么算,公司办个官网需要多少钱?  微信推文制作网站有哪些,怎么做微信推文,急?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel怎么为数据库表字段添加索引以优化查询  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel如何创建自定义Artisan命令?(代码示例)  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  javascript中对象的定义、使用以及对象和原型链操作小结  Firefox Developer Edition开发者版本入口  实现点击下箭头变上箭头来回切换的两种方法【推荐】  node.js报错:Cannot find module 'ejs'的解决办法  lovemo网页版地址 lovemo官网手机登录  Python并发异常传播_错误处理解析【教程】  如何在阿里云购买域名并搭建网站?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Android滚轮选择时间控件使用详解