首先需要安装扩展
composer require topthink/think-queue
composer require predis/predis
然后配置redis参数,账号密码。
app目录下新建job目录,新建文件MultiTask.php
<?php
namespace app\job;
use think\queue\Job;
class MultiTask
{
public function taskA(Job $job, $data)
{
$isJobDone = $this->_doTaskA($data);
if ($isJobDone) {
$job->delete();
print("Info: TaskA of Job MultiTask has been done and deleted" . "\n");
} else {
$job->release(3);
print("任务3s后再次被执行");
}
if ($job->attempts() > 3) {
print("Job has been retried more than 3 times!");
$job->delete();
}
}
public function taskB(Job $job, $data)
{
$isJobDone = $this->_doTaskB($data);
if ($isJobDone) {
$job->delete();
print("Info: TaskB of Job MultiTask has been done and deleted" . "\n");
} else {
$job->release(3);
print("任务3s后再次被执行");
}
if ($job->attempts() > 3) {
print("重试三次失败,删除");
$job->delete();
return false;
}
}
private function _doTaskA($data)
{
print("Info: doing TaskA of Job MultiTask " . "\n");
return false;
// return true;
}
private function _doTaskB($data)
{
print("Info: doing TaskB of Job MultiTask " . "\n");
return false;
// return true;
}
}
其中$data就是redis存储的参数,会自动json_decode,取来可直接进行相应的逻辑操作。
添加任务队列时:
/**
* 多任务
* @param Request $request
* @return string
*/
public function multiTask(Request $request)
{
$param = $request->param();
$taskType = $param['taskType'];
switch ($taskType) {
case 'taskA':
$jobHandlerClassName = 'app\job\MultiTask@taskA';
$jobQueueName = "multiTaskJobQueue";
$jobDataArr = ['a' => '1'];
break;
case 'taskB':
$jobHandlerClassName = 'app\job\MultiTask@taskB';
$jobQueueName = "multiTaskJobQueue";
$jobDataArr = ['b' => '2'];
break;
default:
break;
}
//Queue::later();//立即执行
//$isPushed = Queue::later(10, $jobHandlerClassName, $jobDataArr, $jobQueueName);//延时队列10s后执行
$isPushed = Queue::push($jobHandlerClassName, $jobDataArr, $jobQueueName);
if ($isPushed !== false) {
return '队列添加成功';
} else {
return '插入失败了';
}
}
根据业务需求更改参数,亲测可用。
本文含有隐藏内容,请 开通VIP 后查看