基于PHP-Resque、Redis的生产消费MQ

项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。

前置条件

liunx

redis(

安装方式参考之前文章

消息队列选择php-resque

git地址

git://github.com/chrisboulton/php-resque.git

克隆好文件夹内容应该如下图

传到测试服务器,命令行输入

php queue.php PHP_Job

会报错,提示如图

需要用到composer(composer.json文件参考下一篇推文)

安装好之后再执行php queue.php queue【自定义queue名】PHP_Job【自定义job名】,如果出现

表示服务端redis没有长运行,开启redis

执行

成功创建job

php check_status.php d2fadd4c48cd1ceb8d36030b44b681c9

返回状态都是1,字典在

说明已生产、未消费

进入redis-cli,可以看到生成了几条job的记录

下面开始开启消费者

QUEUE=* php resque.php

错误日志中大概推测没有exec权限,修改php.ini,重启php-fpm

再次执行

QUEUE=*【可以写创建job时候的queue名,多个用逗号(,)隔开】 php resque.php >> log.log 2>&1 &

可以看到:日志信息里面记录了消费者的Pid

同时使用php check_status.php查询状态,看到是4,已完成

reids里面也能看到多了一个worker的记录

测试,把resque进程都kill掉,如图

再创建生产者,查询状态一直是1,未处理

当开启消费者进程之后,状态变成2:处理中-》4:已完成

以上,是实践过程,基于此,可以实现许多类似消费者生产者模式的消息队列,比如发送邮件、通知等,将结果同步返回,后台处理业务逻辑,可避免出现类似

Severity: Warning --> fwrite(): SSL: Broken pipe

的问题

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180629G14ZW600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券