php workman消息提醒,原生workman实现消息推送
原生workman实现及时消息推送
需求:
共享单车关闭后,会通过设置的url,进行回调,发送数据。那么相对于共享单车关锁来说,回调给url的数据,对于客户端来说是异步操作,那么如何使回调变成同步操作,客户端能立即收到关锁之后的信息呢?
问题:
由于进程之间申请的内存不能共享,所以当你直接调用workman里面封装的方法时,会无法拿到数据。所以好多人就会出现,在回调里面调用推送的方法,提示 未定义方法或方法不存在的情况
workman 代码:
use Workerman\Worker;
use Workerman\Lib\Timer;
//引入workman自动加载类
require_once __DIR__.'/../../Workerman/Autoloader.php';
//设置心跳时间 55秒
define('Heartbeat',55);
$ws = new Worker('websocket://0.0.0.0:8013');
// 启动1个进程对外提供服务
$ws->count = 1;
// 新增加一个属性,用来保存uid到connection的映射(uid是用户id或者客户端唯一标识)
$ws->uidConnections = array();
$ws->onWorkerStart = function ($ws){
//设置一个 间隔 1秒的定时
Timer::add(1,function ()use($ws){
$time_now = time();
foreach($ws->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > Heartbeat) {
$connection->close();
}
}
});
// 开启一个内部端口,方便内部系统推送数据,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();
};
// 当收到客户端发来的数据后返回hello $data给客户端
$ws->onMessage = function($connection, $data)
{
global $ws;
// 给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间
$connection->lastMessageTime = time();
if(!isset($connection->uid))
{
//简单的验证
if(intval($data))
{
// 没验证的话把第一个包当做uid
$connection->uid = $data;
/* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
echo $connection->uid."已上线\n";
$ws->uidConnections[$connection->uid] = $connection;
}
return ;
}
};
// 当有客户端连接断开时
$ws->onClose = function($connection)
{
global $ws;
if(isset($connection->uid))
{
echo $connection->uid."已断开\n";
// 连接断开时删除映射
unset($ws->uidConnections[$connection->uid]);
}
};
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
global $ws;
if(isset($ws->uidConnections[$uid]))
{
$connection = $ws->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
// 运行worker
Worker::runAll();
callback 代码:
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 3);
// 推送的数据,包含uid字段,表示是给这个uid推送
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($row)."\n");
// 读取推送结果,并写入日志
Log::notice('订单消息推送'.fread($client, 8192));
fclose($client);
注意:
进程之间内存不能共享,所以在websocket Worker内部建立一个text Worker,这两个Worker是同一个进程,可以方便的共享客户端连接
设置了全局变量,全局变量用完之后要销毁删除,否则造成 内存泄漏 导致程序boom
设置websocket心跳,保证长连接在线
客户端收到推送的订单后,进行一系列操作
php workman消息提醒,原生workman实现消息推送相关推荐
- RabbitMq 消息发送确认(可靠生产和推送确认)
RabbitMq 消息发送确认(可靠生产和推送确认) 此文档只是本人在项目中碰到的一些问题而产生的个人相关总结,实际上的消息确认机制可以做得更多(比如分布式事务等,但此处不做阐述). 一.消息发送确认 ...
- python自动推送消息_使用Python制作自动推送微信消息提醒的备忘录功能
日常工作生活中,事情一多,就会忘记一些该做未做的事情.即使有时候把事情记录在了小本本上或者手机.电脑端备忘录上,也总会有查看不及时,导致错过的尴尬.如果有一款小工具,可以及时提醒,而不用再主动去查备忘 ...
- 配置 Hi提醒 让直播提醒机器人消息在主播开播自动推送消息到钉钉群
今天我们来配置Hi提醒 实现指定主播开播时推送直播提醒消息到钉钉群 主要实现是创建好钉钉群机器人,然后推送信息时选择钉钉就行了. 该通道配置完成后可推送信息至你的钉钉群中,一次配置持久使用. 直接看操 ...
- Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载
场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...
- python发钉钉消息_Python调用钉钉机器人推送消息
1.创建钉钉机器人 群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步: 进入一个钉钉群,点击右上角的"群设置"进入群设置页面: 选择 ...
- 有赞“小程序订阅消息”功能上线 支持商家主动推送「活动通知」
12月7日消息,有赞微商城"小程序订阅消息"功能正式上线,设置领券.订单.签到等多个场景的授权,并支持商家主动推送营销活动类「活动通知」给消费者.目前,此功能已支持食品.服饰鞋包. ...
- 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...
近日,统一推送联盟称,小米手机(含Redmi品牌在内)的系统推送服务已符合统一推送的各项技术要求.截至目前,在中国市场上具有一定知名度.号召力的安卓手机品牌几乎都已经加入统一推送联盟,除了有华为.vi ...
- 微信小程序模板消息还能群发?无限制推送?
模版消息推送是微信小程序采用的通知形式,用户本人在小程序页面有交互行为后,可触发下发通知,通过微信聊天列表中的服务通知可快捷进入查看消息.此外,点击查看详情还能跳转到下发消息的小程序的指定页面.但是为 ...
- 突破微信小程序模板消息限制,实现无限制主动推送
需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...
- 微信小程序模板消息限制,实现无限制主动推送
需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...
最新文章
- Redis之单线程 Reactor 模型
- .NET Core微服务之基于Consul实现服务治理
- 推荐系统与协作过滤面临的主要问题
- js img图片加载失败,重新加载+断网检查
- 对select的结果进行count统计
- SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
- Intel OpenCL + Ubuntu安装
- js java用var_Java基础———JavaScript基础知识
- python循环括号_Python3中小括号()、中括号[]、花括号{}的区别详解
- ps、ai、cdr2021平面设计三大软件的区别有哪些?
- matlab将多个nc文件进行合成TIF
- 数据结构 周末舞会(循环队列解法)
- 获取UI控件位置信息
- 【光模块、光接口及光纤知识】
- 线性代数 --- Gauss消元的部分主元法和完全主元法
- windows10 背景加载不出来变成黑色背景
- VBA之for循环使用
- 每日新闻:百度首个无人驾驶运营项目落户武汉;微软叫停Linux专利战;网易携手芬兰电信Elisa;瑞星华为联合发布云安全解决方案...
- 每一页都是干货,送精选15本Python新书,我必须推荐给你
- 漫画 | 领导说“辛苦了”,该怎么回?