PHP-Resque是现成的框架,基於 Redis 开发消息队列系统,消息队列服务要求比较轻量级,用于创建后台作业,将这些作业放在多个队列中,并在稍后处理它们。发短信,发邮件,执行不那么着急的数据库操作等等,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。
第一章 准备
php-resque类包下载
1、composer下载
新建composer.json,内容如下
{
“ require ”:{
“ chrisboulton / php-resque ”:“ 1.2 ”
}
}
运行composer install。
执行 git clone https://github.com/chrisboulton/php-resque.git
3、手动zip下载地址:https://api.github.com/repos/chrisboulton/php-resque/zipball/0549d6c88a4aed934655b7c03b6153349d6c3ad0
要求
PHP 5.3+
Redis 2.2+
第二章 简介
php-resque的设计
在Resque中,一个后台任务被抽象为由三种角色共同完成:
- Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
- Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
- Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
那么基于这个划分,一个后台任务在Resque下的基本流程是这样的:
在Resque中,有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度。
流程如下:
- 将一个后台任务编写为一个独立的Class,这个Class就是一个Job。
- 在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列。
- 以命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列。
- Worker作为守护进程运行,并且定时检查队列。
- 当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法。
第三章 php-resque的使用
编写一个Worker(后续业务处理)
class PHP_Job
{
public function perform()
{
sleep(120);
fwrite(STDOUT, 'Hello!');
}
}
在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法
将Job插入队列
php queue.php PHP_Job
if(empty($argv[1])) {
die('Specify the name of a job to add. e.g, php queue.php PHP_Job');
}
require __DIR__ . '/init.php';
date_default_timezone_set('GMT');
Resque::setBackend('127.0.0.1:6379');
$args = array(
'time' => time(),
'array' => array(
'test' => 'test',
),
);
$jobId = Resque::enqueue('default', $argv[1], $args, true);
echo "Queued job ".$jobId."\n\n";
查看Job运行情况
php check_status.php b1f01038e5e833d24b46271a0e31f6d6
我们刚才创建的Job状态为1。在Resque中,一个Job有以下4种状态:
Resque_Job_Status::STATUS_WAITING = 1; (等待)
Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
Resque_Job_Status::STATUS_FAILED = 3; (失败)
Resque_Job_Status::STATUS_COMPLETE = 4; (结束)
运行Worker
QUEUE=default php resque.php
参数:VVERBOSE=1 查看work工作状态
总结一下Redis中的key对应的内容及其含义如下:
resque:workers (set) - 存放所有的worker,每一个值都是{worker host}:{进程ID}:{queue的名称}
resque:queues (set) - 存放所有queue的名称
resque:queue:default (list) - 保存这个队列中等待执行的Job
resque:job:52f5abf5344094efc417e7ea8f1aa083:status (string) - 存放job的状态信息
resque:stat:processed (string) - 保存所有worker执行job成功的个数
resque:stat:processed:jun-Ubuntu:25122:* (string) - 保存一个worker执行job成功的个数
resque:worker:jun-Ubuntu:25122:*:started (string) - 保存一个worker的启动时间
resque:worker:jun-Ubuntu:25122:* (string) - 保存一个worker当前执行的Job的所有信息
php-resque使用参考传送门有:
-
http://blog.youkuaiyun.com/u012129607/article/details/78560482
-
http://blog.youkuaiyun.com/helencoder/article/details/51122424
redis重起:redis-cli -h 127.0.0.1 -p 6379 shutdown