Swoole定时队列任务+消息推送

昨晚我躺在床上,百无聊赖地翻阅 阿兰·德波顿《身份的焦虑》这本书,看到这么一段话,让我想起网络上做墙头草的键盘侠,他们喜欢贴标签,然后去简单粗暴地批评或讨好一类人,那么可以说公众的眼睛是雪亮的吗?我一直不喜欢太绝对太肯定的观点,对此我也保留怀疑,包括那些道听途说来的道理。

      公共舆论的缺陷,究其原因,在于公众不愿意将自己的观点交由理性分析进行推敲,而是将自己的观点建立在直觉、感情和习俗之上。

    我经常在早餐出门上班的时候,会在微信小程序点一份麦当劳6元实惠早餐(酸菜鸡肉粥+薯饼),然后路过的时候,顺路取餐。

    但是我最近发现,麦当劳提供了 选择取餐时间的服务。然后在对应的时间推动信息,提醒用户取餐。

这么做有两个好处

  • 保证客户食物的新鲜

  • 工作人员可按照时间去处理订单

 

emmm  我觉得这是个好的商业idea。

在吃完这份早餐,我就想,要不用代码实现一个这个功能的demo吧。

 

主要的工具

  • swoole的websocket 服务端

  • swoole的异步毫秒定时器

  • redis 的有序集合

如果是在微信开发的话,其实调用一下微信的模板信息接口,进行消息推送。swoole_timer_after函数是一个一次性定时器,执行完成后就会销毁。此函数与PHP标准库提供的sleep函数不同,after是非阻塞的。而sleep调用后会导致当前的进程进入阻塞,将无法处理新的请求。

使用redis 的有序集合可以的实现按照取餐时间排序的队列结构(图我自己画的),这里我怕同一秒内有多个用户下单,并发造成队列的覆盖,我选用了php获取毫秒的内置函数()

microtime(true)//一定要加上ture才能返回浮点数据

餐厅的工作人员可按照上面的列表来

服务端生产队列和异步推送信息的代码实现

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: 印第安老斑鸠
 5  * Date: 2019/2/14
 6  * Time: 10:30
 7  */
 8 $server = new  swoole_websocket_server("0.0.0.0",9501);
 9 $server->set(array(
10     'worker_num'=>2,
11 ));
12 $redis = new redis();
13 $redis->connect('127.0.0.1', 6379);
14 $server->on('open', function (Swoole\WebSocket\Server $server, $request) {});
15 $server->on('message', function (Swoole\WebSocket\Server $server, $frame) use ($redis){
16     //将任务安装时间丢进redis的有序集合之中(实际上要同步存进数据库)
17     $result = $redis->zAdd('queue',microtime(true),'用户user'.time());
18     if ($result){
19         swoole_timer_after($frame->data,function () use($frame,$server){
20             //做异常捕获,失败的话就通知失败
21             try{
22                 $str = "你好,你在".(($frame->data)/1000).'秒前的预定的套餐,请到店内柜台前拿取';
23                 $server->push($frame->fd,$str);
24             }catch (Exception $exception){
25                 $server->push($frame->fd,'订单失败');
26             }
27         });
28     }
29     $server->push($frame->fd,"支付成功。请稍后,接收通知!");
30 });
31 $server->on('close', function ($ser, $fd) {
32     echo "client {$fd} closed\n";
33 });
34 $server->start();

 

定时任务消费队列的代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: 印第安老斑鸠
 * Date: 2019/2/15
 * Time: 12:07
 */
$redis = new Redis();
$redis->connect('localhost',6379);
//3秒钟查询一次任务队列
swoole_timer_tick(3000,function ()use($redis){
    $result = $redis->zRange('queue',0,-1);
    if($result){
        foreach ($result as $res){
            $redis->zRem("queue", $res);
            echo "队列中的".$res."的订单已经处理完毕\n";
        }
    }else{
        echo "目前没有队列订单任务";
    }
});

测试结果:我创建了websocket 服务,端口是9501

 

启动队列的消费的进程,结果:

ok,就这么一个demo搞定!但并不能投放于工业生产。

微信公众号:

 

原文地址:https://www.cnblogs.com/zhengweizhao/p/10410511.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.SW的HttpServerHttpServer的本质仍然是swoole_server,其协议加些部分固定使用Http协议解析,支持同步和异步2种模式完整的HTTP协议请求会被封装在swoole_http_request对象内,所有HTTP响应都会通过swoole_http_response对象进行封装和发送无论是同步模式还是异步模式,HttpServer都可
1、Swoole依赖安装hiredissudowgethttps://github.comedis/hiredis/archive/v0.14.0.tar.gzsudotarxfv0.14.0.tar.gzcdhiredis-0.14.0/sudomakesudomakeinstallsudoldconfig需要在编译时增加--enable-async-redis来开启此功能nghttp2sudowgethttps://gith
直接安装会提示找不到openssl/ssl.h文件即便通过Brew安装了OpenSSLbrewinstallopenssl他自己找不到我们手动让他找到就行了呗…当然OpenSSL一定是要安装的,命令就在上方…然后brewinfoopenssl可以看到:Forcompilerstofindopensslyoumayneedtoset:
1.安装依赖yum install -y php php-pear php-devel httpd gcc gcc-c++2.编译安装swoole上传并解压swoole 源码包至服务器 swoole-src-4.3.1.tar.gzcd  /usr/local/swoole-src-4.3.1输入  phpize执行 ./configure执行 make && make install3.配置PHP支持该
下载swoole地址:https://pan.baidu.com/s/1_N3RiFtT3iHLA5xt6oElqA下载后解压tar-zxvf......执行phpize(去php的安装目录执行这个)如果报以下错误:Cannotfindconfig.m4.Makesurethatyourun'/srv/php/bin/phpize'inthetoplevelsourcedirectoryofthem
昨晚我躺在床上,百无聊赖地翻阅 阿兰·德波顿《身份的焦虑》这本书,看到这么一段话,让我想起网络上做墙头草的键盘侠,他们喜欢贴标签,然后去简单粗暴地批评或讨好一类人,那么可以说公众的眼睛是雪亮的吗?我一直不喜欢太绝对太肯定的观点,对此我也保留怀疑,包括那些道听途说来的道理。  
本着开源为原则,为这个世界更美好作出一份共享,我就给大家做个指路人,如果实用,记得给提供开源的朋友一些鼓励。简单介绍一下实现思路,使用swoole扩展接管php运行,由于swoole只能在类UNIX上运行,所以win朋友需要安装cygwin运行的类UNIX模拟环境。为了照顾大多数用户,这里就以win为例:首先
1.文件锁子进程回复制父进程的IO句柄,但是不能让所有的子进程同时对同一个文件进行操作,所以需要文件锁。2.进程间的通讯方式--管道管道是一组(2个)特殊的描述符管道需要在fork函数调用前创建如果某一段主动关闭管道,另一端读取操作会直接返回0,之后会关闭管道在父进程中创建管道的时候
环境:gccyuminstallgcc第一步:下载swoole包wgethttp://pecl.php.net/package/swoole第二步:解压,并进入执行:/usr/local/php/bin/phpize可能会报错Cannotfindautoconf.Pleasecheckyourautoconfinstallationandthe?$PHP_AUTOCONF?environmentvariableissetcorrectly
1、安装swoolewgethttps://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gztarzxvfv1.9.1-stable.tar.gzcdswoole-src-1.9.1-stable/usr/local/php/bin/phpize./configure--with-php-config=/usr/local/php/bin/php-configmakemakeinstall2、配置php支持swoolevi
由来环境:PHP7、Swoole、linux对聊天室有点感兴趣,对于网络协议有一点一知半解,所以决定借助swoole实现个简单的聊天室,来简单剖析下原理,知道原理以后就可以考虑用其他语言或者自己造轮子写个,当然这是后话。源码我放置github(https://github.com/WalkingSun/SwooleServer),有兴趣可
检查环境是否满足Swoole的环境依赖#查看linux内核uname-a#查看gcc版本gcc--versiong++--version升级gcc到4.8以上cd/usr/local/srcwgetwgethttp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2tar-jxvfgcc-4.8.5.tar.bz2cdgcc-4.8.5/usr/local/sr
卸载现有phpapt-getautoremovephp7*find/etc-name"*php*"|xargsrm-rfaptpurge`dpkg-l|grepphp|awk'{print$2}'|tr"\n"""`编译安装phpaptinstallgccmakelibxml2libxml2-devwgethttp://cn2.php.net/distrib
目录概述代码小结扩展参考文档概述Swoole异步Task,主要实现调用异步任务的执行。常用的场景:异步支付处理、异步订单处理、异步日志处理、异步发送邮件/短信等。Swoole的实现方式是worker进程处理数据请求,分配给task进程执行。官方介绍:task底层使用UnixSoc
上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用使用swoole实现tcp服务<?php$serv=newSwoole\Server("0.0.0.0",9501);$serv->on('connect',function($serv,$fd){echo"客户端".$fd."连接成功\n";});$serv-&
一、同步与异步的区别:1、同步模式:后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的.2、异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个
1.什么是RPCRPC是一种进程间的通讯方式,全称是“远程调用过程”。当客户端向服务器发出请求时,并不是至直接发送给目标服务器,而是发送给RPCServer,由RPCServer进行调度。RPC提供与调用本地方法无差别的远程调用方法。2.Hprose简介Hprose是一个轻量级的高性能跨语言RPC服务框架;提供
swoole中,接受数据流处理时,需要将数据流切分成小包才能进行功能的实现,以下为常见的几个协议1.EOF协议EOF协议是用一组固定的,不会出现在数据内的字符作为数据分割的标记,简称EOF协议EOF协议的格式如下:DATA|EOF|DATA|EOF|......2.固定包头协议在数
环境依赖:swoole-1.x需要php-5.3.10或更高版本,swoole-2.x需要php-7.0.0或更高版本。安装步骤:[root@dev~]#cd/usr/local/src[root@devsrc]#wgethttp://pecl.php.net//get/swoole-4.3.5.tgz[root@devsrc]#tar-zxvfswoole-4.3.5.tgz[root@devsrc]#cdsw
Swoole:面向生产环境的PHP异步网络通信引擎    使PHP开发人员可以编写高性能的异步并发TCP、UDP、UnixSocket、HTTP,WebSocket服务。Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用PHP+Swoole作