PHPphp-resque的规划和选取

php-resque的使用

编制一个Worker
实际php-resque已经交给了简短的例证,
demo/job.php文件正是七个最简便的Job:

class PHP_Job
{
    public function perform()
    {
        sleep(120);
        fwrite(STDOUT, 'Hello!');
    }
}

那么些Job就是在120秒后向STDOUT输出字符Hello!

在Resque的计划中,八个Job必须存在一个perform方法,Worker则会自动运转那些措施。

将Job插入队列
php-resque也交给了最简便的插入队列完结 demo/queue.php:

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";

在这么些例子中,queue.php必要以cli情势运营,将cli接收到的首先个参数作为Job名称,插入名字为’default’的队列,同时向显示器输出刚才插入队列的Job
Id。在顶峰输入:

cd demo
php queue.php PHP_Job

结果可以看出显示屏上输出:

Queued job 52f5abf5344094efc417e7ea8f1aa083

即Job已经增加成功。注意那里的Job名称与大家编辑的Job
Class名称保持一致:PHP_Job
在那个时候连接redis-cli,能够看出有如下多少个key:

1) "resque:job:52f5abf5344094efc417e7ea8f1aa083:status"
2) "resque:queue:default"
3) "resque:queues"

分级用如下命令查看其种类:

type resque:job:52f5abf5344094efc417e7ea8f1aa083:status
type resque:queue:default
type resque:queues

其品种分别是:string/list/set
PHP,取出resque:job:5贰f5abf5344094efc四一7e七ea八f壹aa083:status的剧情查看:

get resque:job:52f5abf5344094efc417e7ea8f1aa083:status

其内容如下:

"{\"status\":1,\"updated\":1438095296,\"started\":1438095296}"

个中的status表示Job运市价况,updated表示更新时间,started表示初阶时间。
此地存放的是job执市价况的新闻。
php-resque同样也提供了翻看Job运转情况的例子,直接运维:

php check_status.php 52f5abf5344094efc417e7ea8f1aa083

能够看到输出为:

Tracking status of 52f5abf5344094efc417e7ea8f1aa083. Press [break] to stop. 
Status of 52f5abf5344094efc417e7ea8f1aa083 is: 1

咱俩刚刚创制的Job状态为1。在Resque中,二个Job有以下4种情状:

  • Resque_Job_Status::STATUS_WAITING = 1; (等待)
  • Resque_Job_Status::STATUS_RUNNING = 二; (正在推行)
  • Resque_Job_Status::STATUS_FAILED = 3; (失败)
  • Resque_Job_Status::STATUS_COMPLETE = 4; (结束)

取出resque:queue:default的剧情查看(key中的default是在前头代码中定义的queue的称谓):

lrange resque:queue:default 0 -1

其剧情如下:

1) "{\"class\":\"PHP_Job\",\"args\":[{\"time\":1438095296,\"array\":{\"test\":\"test\"}}],\"id\":\"52f5abf5344094efc417e7ea8f1aa083\"}"

内部的class表示Job的类,args表示Job执行时的参数,id表示Job的ID,能够遵照那个ID去查询Job执汇兑况的新闻。
此处存放的是各样要实施的Job的相干新闻。因为只添加了叁个,所以在default的行列中,唯有二个值。

取出resque:queues的始末查看:

smembers resque:queues

其内容如下:

1) "default"

此处存放的是兼具队列的名号。因为唯有三个,所以在queues的汇集中,只有3个值。

因为未有Worker运维,所以刚刚创建的Job如故等待状态。
运行Worker
这一次大家一贯编写demo/resque.php:

date_default_timezone_set('GMT');
require 'job.php';
require '../bin/resque';

能够看到一个Worker至少须要两部分:

可以平素包罗Job类文件,也能够行使php的全自动加运载飞机制,钦赐好Job
Class所在路子并能完毕全自动加载
包含Resque的默认Worker: bin/resque
在终极中运作:

QUEUE=default php resque.php

如今的QUEUE部分是安装环境变量,大家钦命当前的Worker只承担处理default队列。也足以行使

QUEUE=* php resque.php

来处理全部队列。

运维后输出为

#!/usr/bin/env php
*** Starting worker jun-Ubuntu:23437:*

用ps指令检查一下:

ps aux | grep resque

能够见到有二个php的看护进度早已在运营了

jun      23437  1.0  0.3 314148 14884 pts/16   S+   23:23   0:00 php resque.php

在那一年再连接受redis-cli,查看key,能够看看如下key:

1) "resque:job:52f5abf5344094efc417e7ea8f1aa083:status"
2) "resque:workers"
3) "resque:queues"
4) "resque:worker:jun-Ubuntu:25122:*:started"
5) "resque:worker:jun-Ubuntu:25122:*"

分别查看新增的key是何许项目:

type resque:workers
type resque:worker:jun-Ubuntu:25122:*:started
type resque:worker:jun-Ubuntu:25122:*

其连串分别是set/string/string
分别取出其内容,命令就不再写了,请参考此前的始末
resque:workers中的内容如下:

1) "jun-Ubuntu:25122:*"

此地存放的是兼具worker的经过ID。因为唯有1个,所以在workers的集结中,唯有多个值。
resque:worker:jun-Ubuntu:25122::started中的内容如下(key中的jun-Ubuntu:2512二:是worker的host+进程ID+queue的名称):

"Tue Jul 28 15:29:37 GMT 2015"

此间存放的是Job运营的时刻。
resque:worker:jun-Ubuntu:25122:中的内容如下(key中的jun-Ubuntu:2512贰:是worker的host+进程ID+queue的名称):

"{\"queue\":\"default\",\"run_at\":\"Tue Jul 28 15:29:37 GMT 2015\",\"payload\":{\"class\":\"PHP_Job\",\"args\":[{\"time\":1438097296,\"array\":{\"test\":\"test\"}}],\"id\":\"52f5abf5344094efc417e7ea8f1aa083\"}}"

此处存放的是其1worker当前施行的Job的有所音信。
于此同时,resque:job:5二f伍abf5344094efc四1七e七ea8f一aa0八叁:status中的内容变为如下内容:

"{\"status\":2,\"updated\":1438097377}"

气象变为二(正在履行)了。
也得以运用此前的检讨Job指令

php check_status.php 52f5abf5344094efc417e7ea8f1aa083

二分钟后再连接受redis-cli上去查看key,能够见到如下key:

1) "resque:job:52f5abf5344094efc417e7ea8f1aa083:status"
2) "resque:workers"
3) "resque:stat:processed"
4) "resque:stat:processed:jun-Ubuntu:25122:*"
5) "resque:queues"
6) "resque:worker:jun-Ubuntu:25122:*:started"

其中的resque:stat:processed和resque:stat:processed:jun-Ubuntu:25122:都以string类型,分别表示所有worker执行job成功的个数和worker为jun-Ubuntu:2512贰:的进行job成功的个数。
今年再去查看以下resque:job:52f伍abf53440玖四efc四一七e柒ea八f1aa0八三:status的始末,发现事态已经变为4(结束)了。
也能够行使此前的检查Job指令查看,其结果如下:

Status of 52f5abf5344094efc417e7ea8f1aa083 is: 4

那代表任务现已运营达成,同时荧屏上应有能够见见输出的Hello!

至此大家曾经打响的完结了一个最简便易行的Resque实例的满贯演示,更扑朔迷离的气象以及遗留的难题会在下一遍的日志中注明。

小结一下Redis中的key对应的始末及其含义如下:

  • resque:workers (set) – 存放全部的worker,每一个值都以{worker
    host}:{进程ID}:{queue的称谓}
  • resque:queues (set) – 存放全部queue的名目
  • resque:queue:default (list) – 保存这几个行列中伺机执行的Job
  • resque:job:5贰f伍abf53440九四efc四一七e7ea八f壹aa083:status (string) –
    存放job的景况音讯
  • resque:stat:processed (string) – 保存全数worker执行job成功的个数
  • resque:stat:processed:jun-Ubuntu:25122:* (string) –
    保存2个worker执行job成功的个数
  • resque:worker:jun-Ubuntu:25122:*:started (string) –
    保存1个worker的运行时间
  • resque:worker:jun-Ubuntu:25122:* (string) –
    保存1个worker当前实践的Job的全数音讯

参考摘录:
PHP的轻量音讯队列php-resque使用验证

php-resque的设计

在Resque中,3个后台职责被架空为由三种剧中人物共同达成:

  • Job | 任务 :
    2个Job正是2个索要在后台完毕的天职,比如本文举例的发送邮件,就能够抽象为一个Job。在Resque中一个Job正是一个Class。
  • Queue | 队列 :
    也正是上文的新闻队列,在Resque中,队列则是由Redis达成的。Resque还提供了1个粗略的行列管理器,能够达成将Job插入/取出队列等效果。
  • Worker | 执行者 :
    负责从队列中取出Job并履行,能够以守护进度的格局运行在后台。
    那么依照这么些划分,贰个后台职分在Resque下的着力流程是那般的:

在Resque中,有三个很关键的宏图:3个Worker,能够拍卖3个行列,也能够拍卖很七个系列,并且可以经过扩大Worker的经过/线程数来增长速度队列的推行进程。

流程如下:

  • 将2个后台职务编写为2个独立的Class,这些Class正是2个Job。
  • 在供给选择后台程序的地点,系统将Job
    Class的称谓以及所需参数放入队列。
  • 以命令行格局打开一个Worker,并由此参数钦命Worker所必要处理的队列。
  • Worker作为医生和护师进度运转,并且定时检查队列。
  • 当队列中有Job时,Worker取出Job并运转,即实例化Job
    Class并施行Class中的方法。

php-resque-1.2-annotated
1个 php-resque 源码阅读的体系,欢迎我们star

相关文章