安装与配置:
- 是用Composer进行安装,命令:composer require topthink/think-queue(版本加上=2.0.*)
- 配置文件位于 application/extra/queue.php(本文使用类型是Redis)
- 配置文件 application/extra/queue.php
return [
'connector' => 'Redis',
'expire' => 180, // 任务过期时间,若要禁止则设置为null
'default' => 'default', // 默认队列名称
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'select' => 6, // redis db
'timeout' => 0, // redis连接超时时间
'persistent' => false, // 是否是长连接
];
4.新建 application/index/controller/MyQueue.php
namespace app\index\controller;
use think\Controller;
use think\Queue;
class MyQueue extends Controller
{
public function index($job_data, $type = 'push') //jio_data 需要发送的数据
{
$job_class = "app\index\job\Message@deal"; // 任务类 - 执行时调用该类的deal方法
$job_queue_name = 'Check';// 队列名称
switch ($type) {
case 'later':
$is_push = Queue::later(5, $job_class, $job_data, $job_queue_name); // 延迟发送任务 5秒
break;
case 'push':
$is_push = Queue::push($job_class, $job_data, $job_queue_name); // 立即发送任务
break;
}
if ($is_push !== false) {
echo date('Y-m-d H:i:s') . " 新增任务" . "<br>";
} else {
echo '新增任务错误';
}
}
}
5.新建application/index/job/Message.php(对应调用方法)
namespace app\index\job;
use app\index\model\newsinfo;
use think\queue\Job;
class Message
{
/* 处理逻辑 */
public function deal(Job $job, $data)
{
//任务执行超过1次,则删除任务
$nums=$job->attempts();
if ($nums >0) {
$job->delete();
}
$job->delete();
}
}
//每次执行完Job之后需要delete掉,不然他会在里面反复执行
//$job->attempts()只是去获取队列给返回的data这条数据的执行次数,延时队列没有到时候是不会去执行deal这个函数的,进入就说明要执行这条数据了,attempts的次数只会在你执行失败,或者执行完了没有delete才会+1
//push是正常队列 later是延时队列 执行流程可以通过Log::write()用日志查看