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 = arra
y();
// 当有客户端发来消息时执行的回调函数
$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滚轮选择时间控件使用详解
上一篇:js实现百度登录框鼠标拖拽效果
上一篇:js实现百度登录框鼠标拖拽效果


y();
// 当有客户端发来消息时执行的回调函数
$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);