实验场景:页面被客户访问发送邮件通知到我的邮箱,该场景只是为了测试,下单发送邮件或者短信的场景都是一样的,为了体现出来队列的优越性,我自己封装了个邮件发送的接口,接口内部实现增加了sleep(5),纯粹是为了给接口增加耗时,更好的达标实验效果。

workerman的redis-queue地址:

自己封装的邮件发送接口地址:

如果在页面里面直接调用发送邮件接口的话,页面需要等待5秒才能加载出来。代码实现如下

//直接调用, 在接口方故意模拟sleep( 5 ), 下面就会等5秒,上面就不用等直接扔给队列执行

$html='被访问了下'.date('Y-m-d H:i:s');

$apiurl='http://phpmailer.wlphp.com/sendmail_api.php?html='.urlencode($html).'&recipient=613154514@qq.com&subject=workerman的redis消息队列消息';

echofile_get_contents($apiurl);

消息队列实现:该页面在是thinkphp5的mvc框架里面首先在核心函数库放入如下函数:

//有时候一些项目运行在apache或者php-fpm环境,无法使用workerman/redis-queue项目,可以参考如下函数实现发送

functionredis_queue_send($redis,$queue,$data,$delay=0) {

$queue_waiting='redis-queue-waiting';

$queue_delay='redis-queue-delayed';

$now=time();

$package_str=json_encode([

'id'=>rand(),

'time'=>$now,

'delay'=>0,

'attempts'=>0,

'queue'=>$queue,

'data'=>$data

]);

if($delay) {

return$redis->zAdd($queue_delay,$now+$delay,$package_str);

}

return$redis->lPush($queue_waiting.$queue,$package_str);

}

在页面控制器对应方法里面调用这个函数把要发送邮件信息添加到消息队列里面实现代码如下:

//基于redis的消息队列服务

$html='被访问了下'.date('Y-m-d H:i:s');

$redis=new\Redis;

$redis->connect('127.0.0.1',6379);

$queue='user-1';

$data= [date('Y-m-d H:i:s'),$html];

redis_queue_send($redis,$queue,$data);

mvc框架里面只需要把消息仍进队列,不管邮件是否发送成功,所以不会造成阻塞,页面加载速度基本不受影响。

页面多刷新几次然后打开redis能够看见如下队列:

启动基于wokerman的消费者端:注意生产者在mvc框架里面,随时把消息添加到队列。消费者端基于cli命令行方式启动。

php  index.php  start

启动之后如下:消息被依次消费发送邮件

require __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

use Workerman\Lib\Timer;

use Workerman\RedisQueue\Client;

$worker = new Worker();

$worker->onWorkerStart = function () {

$client = new Client('redis://127.0.0.1:6379');

$client->subscribe('user-1', function($data){

echo "user-1\n";

var_export($data);

//调用发送邮件接口

$html=$data[1];

$apiurl="http://phpmailer.wlphp.com/sendmail_api.php?html=".urlencode($html)."&recipient=613154514@qq.com&subject=workerman的redis消息队列消息";

echo file_get_contents($apiurl);

});

};

Worker::runAll();

版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。

本文链接:基于workerman的redis-queue实现异步邮件队列 - https://www.wlphp.com/?post=250

redis php异步队列,基于workerman的redis-queue实现异步邮件队列相关推荐

  1. k8s redis集群_基于K8S部署redis哨兵集群

    本 文 主 要 内 容 什么是Kubernetes分布式容器管理平台 PaaS平台redis-sentinel集群架构简介 PaaS平台部署redis哨兵集群 redis-sentinel容器测试及验 ...

  2. Exchange系列—管理邮件队列

    集线器传输服务器在从用户邮箱接收邮件后或者是边缘传输服务器从集线器传输服务器端接收到邮件后,由pickup directory组件将邮件提交到提交队列,提交队列组件在邮件被处理之前将邮件存储到硬盘上, ...

  3. celery mysql 异步_celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis]

    前言: 51cto的文章已经不再补充更新了,另外celery rabbitmq详细的使用方法请到这里浏览. http://xiaorui.cc/2014/11/16/celery-rabbitmq%E ...

  4. Redis核心技术与实战-学习笔记(十五):消息队列(Redis的解决方案)

    一.消息队列 消息队列:分布式系统必备的一个基础软件,能支持组件通信消息的快速读写 Redis本身支持数据的快速访问,满足消息队列的读写性能需求 二.Redis适合做消息队列吗? 消息队列的消息存取需 ...

  5. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  6. redis实现轮询算法_用redis实现支持优先级的消息队列

    为什么需要消息队列 系统中引入消息队列机制是对系统一个非常大的改善.例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中.你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样 ...

  7. 如何基于MySQL及Redis搭建统一的kv存储服务 | 秦波

    一.MySQL+Redis常用部署方式 1.1  拓扑 1.2  特点 业务层通过双写同时写MySQL及Redis.读通常在Redis,若读取不到,则从MySQL读取,然后将数据同步到Redis,Re ...

  8. phalapi init.php,基于PhalApi的Redis拓展 (由@喵了个咪提供)

    基于PhalApi的Redis拓展 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 编写本次拓展出于的目的是为了解决并不是非常熟悉redis的童鞋能够 ...

  9. 基于内存,redis,mysql的高速游戏数据服务器设计架构

    1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失, ...

最新文章

  1. 35岁老码农:老板,你看我还有机会吗?
  2. 开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)...
  3. mysql 自定义函数
  4. 意外分配– JIT编译抖动
  5. 使用Spring框架能带来那些好处?
  6. .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法
  7. 不同于其他写脚本的同类文章,使用软件取消赞和关注收藏
  8. 易语言下载别人的源码编译出来用不了_我是如何阅读源码的
  9. WPS2000系列之二样式管理(转)
  10. 062:vue+openlayers绘制正方形、矩形、六芒星( 代码示例 )
  11. 软件工程----UML建模
  12. halcon机器视觉实例1--表面划痕检测
  13. 干货丨千万流量大型分布式系统架构设计实战
  14. 购买亚马逊保险前,卖家须注意的问题值得你收藏!
  15. 给你的Potplayer设置老板键
  16. 记录微星gl63的ubuntu 18.04重装rtl8821ce驱动,重获wifi
  17. 解决VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运行 VMware Workstation。
  18. 前端网站实现图片放大功能
  19. android 开发板修改开机默认桌面
  20. [YTU](3166)共享单车 ---bfs

热门文章

  1. 浅谈DToF技术原理
  2. Machine Learning | (3) Scikit-learn的分类器算法-k-近邻
  3. 数据可视化 | Seaborn
  4. 使用Selenium爬虫进阶
  5. 男女洗澡前后区别,太形象了!
  6. Galaxy Release (v 21.05),众多核心技术栈变更
  7. SBB:南土所梁玉婷、孙波等跨气候带土壤移置揭示了气候变暖及施肥对土壤固氮微生物递增的环境过滤作用...
  8. Microbiome:揩老鼠皮毛揩来高分文章——野生哺乳动物的皮肤和肠道微生物对核污染的反应...
  9. R语言ggplot2可视化:ggplot2可视化时间序列数据并在末尾数据点添加数值标签(number label)
  10. R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)