-
首先安装
think-queue
:不指定版本号的话会安装TP6的库
composer require topthink/think-queue=2.0.*
-
设置queue配置:
composer安装好类库后会自动在config文件夹下生成一个queue.php的文件
根据自身需要,我修改如下:
return [
'connector' => 'Redis', // Redis 驱动
'expire' => 60, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
'default' => 'default', // 默认的队列名称
'host' => '127.0.0.1', // redis 主机ip
'port' => 6379, // redis 端口
'password' => '', // redis 密码
'select' => 0, // 使用哪一个 db,默认为 db0
'timeout' => 0, // redis连接的超时时间
'persistent' => false, // 是否是长连接
];
-
创建队列任务类,命名空间很重要,一会儿要用到!!
<?php
namespace app\admin\admin;
use app\admin\model\Token;
use think\queue\Job;
class Task
{
public function fire(Job $job, $data)
{
//任务失败(重复)3次以上,删除该任务
if ($job->attempts() > 3) {
//TODO
//删除
$job->delete();
} else {
switch ($data['type']) {
case 'sms':
$this->sendSms($job, $data);
break;
case 'email':
$this->sendEmail($job, $data);
break;
default:
//默认操作
$param = [];
for ($i = 1; $i <= 10000; $i++) {
$param[] = [
'token' => \random(10),
'tag' => 'task',
'value' => \rand(10000, 99999),
'create_time' => \time(),
'expire_time' => \time(),
];
}
$res = (new Token())->saveAll($param);
if (!$res) {
$delay = 1;//$delay为延迟时间
//重新发布该任务
$job->release($delay);
} else {
//成功之后
$job->delete();
}
}
}
}
function sendSms($job, $data)
{
// todo
}
function sendEmail($job, $data)
{
// todo
}
}
-
添加队列任务
public function job()
{
// 1.当前任务将由哪个类来负责处理。
// 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
//命名空间要写对,不然找不到对象
$jobHandlerClassName = 'app\admin\admin\task';
// 2.当前任务归属的队列名称,如果为新队列,会自动创建
$jobQueueName = "test";
// 3.当前任务所需的业务数据
$jobData = [
'type' => '',
];
// 4.将该任务推送到消息队列,等待对应的消费者去执行
$isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);
//$isPushed = Queue::later(10,$jobHandlerClassName,$jobData,$jobQueueName); //把任务分配到队列中,延迟10s后执行
// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false
if ($isPushed !== false) {
echo date('Y-m-d H:i:s') . $jobQueueName . " --任务添加成功" . "<br>";
} else {
echo 'something went wrong.';
}
}
-
发布任务
浏览器里执行上面的job
即可将任务添加到名为test
的队列
我们可以到Redis里查看一下:
-
消费与删除
执行php think queue:work --daemon --queue test
可以看到执行情况
-
以上已经完成了队列任务整个流程,我们可以去数据库验证一下:
-
宝塔面板的Supervisor使用
我们可以写个死循环看看这货有没有用
修改消费代码:
发布任务后再来看看宝塔面板:
嗯,确实在跑了~
-
打完收工,嗯?为什么觉得电脑有点卡!