thinkphp消息队列think-queue的基本使用
# 安装
tp5.0
composer require think-queue 1.1.6
1
# 修改配置文件
extra
->queue.php
return [
// 'connector' => 'Sync'
'connector' => 'Redis', // Redis 驱动
'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
'default' => 'default', // 默认的队列名称
'host' => '127.0.0.1', // redis 主机ip
'port' => 6379, // redis 端口
'password' => 'gq2021', // redis 密码
'select' => 1, // 使用哪一个 db,默认为 db0
'timeout' => 0, // redis连接的超时时间
'persistent' => false, // 是否是长连接
];
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 定义任务
可以自定义存放位置,习惯放在 application/job
目录下
例 1
<?php
namespace app\job;
use think\queue\Job;
class Job1{
// 定义 fire 方法,发布任务时可以忽略方法名
public function fire(Job $job, $data){
//....这里执行具体的任务
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
}
//如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法
$job->delete();
// 也可以重新发布这个任务
$job->release($delay); //$delay为延迟时间
}
public function failed($data){
// ...任务达到最大重试次数后,失败了
}
}
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
27
28
29
30
31
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
27
28
29
30
31
例 2
namespace app\lib\job;
use think\queue\Job;
class Job2{
public function task1(Job $job, $data){
}
public function task2(Job $job, $data){
}
public function failed($data){
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 发布任务
think\facade\Queue::push($job, $data = '', $queue = null); // 立即执行
think\facade\Queue::later($delay, $job, $data = '', $queue = null); //$delay秒后执行
1
2
2
$job
: 是任务名 命名空间是app\job
的,比如上面的例子一,写 Job1 类名即可,其他的需要些完整的类名,比如上面的例子二,需要写完整的类名app\job\Job2
如果一个任务类里有多个小任务的话,如上面的例子二,需要用@+方法名app\job\Job2@task1
、app\lib\job\Job2@task2
# 监听任务并执行
&> php think queue:listen
&> php think queue:work
1
2
3
2
3
可配合
supervisor
使用,保证进程常驻
上次更新: 2024/05/10, 14:29:22