队列有3个角色,运行php-resque只需要创建3个相应的脚本即可。
Job | 任务 : 一个Job就是一个需要在后台完成的任务,
Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
进入php-resque目录下的demo目录下创建一下脚本
1、job
# my_job.php
class My_Job {
public function perform() {
sleep(10);
fwrite(STDOUT, 'Hello!');
}
}
1
2
3
4
5
6
7
# my_job.php
classMy_Job{
publicfunctionperform(){
sleep(10);
fwrite(STDOUT,'Hello!');
}
}
创建一个my_job.php。这个是一个任务。方法perform为必须存在,队列执行时候会自动调用这个方法。
2、queue
# my_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";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# my_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";
创建my_queue.php。这是一个队列,主要作用是将任务插入队列(redis)。
3、work
date_default_timezone_set('GMT');
require 'my_job.php';
require '../bin/resque';
1
2
3
date_default_timezone_set('GMT');
require'my_job.php';
require'../bin/resque';
创建my_work.php。这是个任务执行者。负责执行任务。
执行:
# 将任务插入队列
[root@localhost demo]# php my_queue.php My_Job
# 返回的是队列ID号
Queued job f53bea6d5423b8eb4a6d8b2f1b45640d
# 可以通过这个id查询执行状况
[root@localhost demo]# php check_status.php f53bea6d5423b8eb4a6d8b2f1b45640d
Tracking status of f53bea6d5423b8eb4a6d8b2f1b45640d. Press [break] to stop.
Status of f53bea6d5423b8eb4a6d8b2f1b45640d is: 1
# Resque_Job_Status::STATUS_WAITING = 1; (等待)
# Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
# Resque_Job_Status::STATUS_FAILED = 3; (失败)
# Resque_Job_Status::STATUS_COMPLETE = 4; (结束)
# 执行队列
[root@localhost demo]# QUEUE=* php my_work.php
# 输出的日志
#!/usr/bin/env php
[notice] Starting worker localhost.localdomain:1939:*
[notice] Starting work on (Job{default} | ID: faf32b68566a44495054f5bf131b27b2 | My_Job | [{"time":1409643855,"array":{"test":"test"}}])
/******执行输出脚本内容*****/
Hello!
/******执行输出脚本内容*****/
[notice] (Job{default} | ID: faf32b68566a44495054f5bf131b27b2 | My_Job | [{"time":1409643855,"array":{"test":"test"}}]) has finished
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 将任务插入队列
[root@localhostdemo]# php my_queue.php My_Job
# 返回的是队列ID号
Queuedjobf53bea6d5423b8eb4a6d8b2f1b45640d
# 可以通过这个id查询执行状况
[root@localhostdemo]# php check_status.php f53bea6d5423b8eb4a6d8b2f1b45640d
Trackingstatusoff53bea6d5423b8eb4a6d8b2f1b45640d.Press[break]tostop.
Statusoff53bea6d5423b8eb4a6d8b2f1b45640dis:1
# Resque_Job_Status::STATUS_WAITING = 1; (等待)
# Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
# Resque_Job_Status::STATUS_FAILED = 3; (失败)
# Resque_Job_Status::STATUS_COMPLETE = 4; (结束)
# 执行队列
[root@localhostdemo]# QUEUE=* php my_work.php
# 输出的日志
#!/usr/bin/env php
[notice]Startingworkerlocalhost.localdomain:1939:*
[notice]Startingworkon(Job{default}|ID:faf32b68566a44495054f5bf131b27b2|My_Job|[{"time":1409643855,"array":{"test":"test"}}])
/******执行输出脚本内容*****/
Hello!
/******执行输出脚本内容*****/
[notice](Job{default}|ID:faf32b68566a44495054f5bf131b27b2|My_Job|[{"time":1409643855,"array":{"test":"test"}}])hasfinished
参考: