原生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实现消息推送相关推荐

  1. RabbitMq 消息发送确认(可靠生产和推送确认)

    RabbitMq 消息发送确认(可靠生产和推送确认) 此文档只是本人在项目中碰到的一些问题而产生的个人相关总结,实际上的消息确认机制可以做得更多(比如分布式事务等,但此处不做阐述). 一.消息发送确认 ...

  2. python自动推送消息_使用Python制作自动推送微信消息提醒的备忘录功能

    日常工作生活中,事情一多,就会忘记一些该做未做的事情.即使有时候把事情记录在了小本本上或者手机.电脑端备忘录上,也总会有查看不及时,导致错过的尴尬.如果有一款小工具,可以及时提醒,而不用再主动去查备忘 ...

  3. 配置 Hi提醒 让直播提醒机器人消息在主播开播自动推送消息到钉钉群

    今天我们来配置Hi提醒 实现指定主播开播时推送直播提醒消息到钉钉群 主要实现是创建好钉钉群机器人,然后推送信息时选择钉钉就行了. 该通道配置完成后可推送信息至你的钉钉群中,一次配置持久使用. 直接看操 ...

  4. Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载

    场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...

  5. python发钉钉消息_Python调用钉钉机器人推送消息

    1.创建钉钉机器人 群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步: 进入一个钉钉群,点击右上角的"群设置"进入群设置页面: 选择 ...

  6. 有赞“小程序订阅消息”功能上线 支持商家主动推送「活动通知」

    12月7日消息,有赞微商城"小程序订阅消息"功能正式上线,设置领券.订单.签到等多个场景的授权,并支持商家主动推送营销活动类「活动通知」给消费者.目前,此功能已支持食品.服饰鞋包. ...

  7. 后台推送消息给app_小米加入统一推送联盟!避免多种APP后台运行,国产手机春天来了...

    近日,统一推送联盟称,小米手机(含Redmi品牌在内)的系统推送服务已符合统一推送的各项技术要求.截至目前,在中国市场上具有一定知名度.号召力的安卓手机品牌几乎都已经加入统一推送联盟,除了有华为.vi ...

  8. 微信小程序模板消息还能群发?无限制推送?

    模版消息推送是微信小程序采用的通知形式,用户本人在小程序页面有交互行为后,可触发下发通知,通过微信聊天列表中的服务通知可快捷进入查看消息.此外,点击查看详情还能跳转到下发消息的小程序的指定页面.但是为 ...

  9. 突破微信小程序模板消息限制,实现无限制主动推送

    需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...

  10. 微信小程序模板消息限制,实现无限制主动推送

    需求背景 基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发 ...

最新文章

  1. Redis之单线程 Reactor 模型
  2. .NET Core微服务之基于Consul实现服务治理
  3. 推荐系统与协作过滤面临的主要问题
  4. js img图片加载失败,重新加载+断网检查
  5. 对select的结果进行count统计
  6. SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
  7. Intel OpenCL + Ubuntu安装
  8. js java用var_Java基础———JavaScript基础知识
  9. python循环括号_Python3中小括号()、中括号[]、花括号{}的区别详解
  10. ps、ai、cdr2021平面设计三大软件的区别有哪些?
  11. matlab将多个nc文件进行合成TIF
  12. 数据结构 周末舞会(循环队列解法)
  13. 获取UI控件位置信息
  14. 【光模块、光接口及光纤知识】
  15. 线性代数 --- Gauss消元的部分主元法和完全主元法
  16. windows10 背景加载不出来变成黑色背景
  17. VBA之for循环使用
  18. 每日新闻:百度首个无人驾驶运营项目落户武汉;微软叫停Linux专利战;网易携手芬兰电信Elisa;瑞星华为联合发布云安全解决方案...
  19. 每一页都是干货,送精选15本Python新书,我必须推荐给你
  20. 漫画 | 领导说“辛苦了”,该怎么回?

热门文章

  1. linux mint(ubuntu)频率锁定解决
  2. salve mysql_mysql 同步实现, master-salve
  3. 示波器X-Y模式显示利萨如(李沙育)与DIY图像
  4. UE4UMG系统入门
  5. dmp(数据管理平台)是什么?
  6. 外币兑换c语言编程,货币转换 C
  7. rust编程 UI框架 -druid -Selector选择器
  8. iWatch 页面导航
  9. 汤姆猫代码python_用树莓派实现会说话的汤姆猫
  10. 【桶哥的问题——吃桶-简化版】【洛谷p2671】求和