php think queue:work --queue helloJobQueue配置
return [
//Redis驱动
'connector' => 'redis',
"expire" =>60,//任务过期时间默认为秒,禁用为null
"default" =>"default",//默认队列名称
"host" =>"127.0.0.1",//Redis主机IP地址
"port" =>6379,//Redis端口
"password" =>"",//Redis密码
"select" =>0,//Redis数据库索引
"timeout" =>0,//Redis连接超时时间
"persistent" =>false,//是否长连接接口代码<?php
/**
* 文件路径: \application\index\controller\JobTest.php
* 该控制器的业务代码中借助了thinkphp-queue 库,将一个消息推送到消息队列
*/
namespace app\api\controller;
use think\facade\Queue;
class JobTest {
/**
* 一个使用了队列的 action
*/
public function test(){
// 1.当前任务将由哪个类来负责处理。
// 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
$jobHandlerClassName = 'app\api\job\Hello';
// 2.当前任务归属的队列名称,如果为新队列,会自动创建
$jobQueueName = "helloJobQueue";
// 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
// ( jobData 为对象时,存储其public属性的键值对 )
$jobData = [ 'ts' => time(), 'bizId' => uniqid() , 'a' => 1 ] ;
// 4.将该任务推送到消息队列,等待对应的消费者去执行
// $isPushed = Queue::push($jobHandlerClassName , $jobData , $jobQueueName );
$isPushed = Queue::later( 3, $jobHandlerClassName, $jobData, $jobQueueName);
// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false
if( $isPushed !== false ){
echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ".PHP_EOL;
}else{
echo 'Oops, something went wrong.'.PHP_EOL;
}
}
}<?php
/**
* 文件路径: \application\index\job\Hello.php
* 这是一个消费者类,用于处理 helloJobQueue 队列中的任务
*/
namespace app\api\job;
use think\queue\Job;
class Hello {
/**
* fire方法是消息队列默认调用的方法
* @param Job $job 当前的任务对象
* @param array|mixed $data 发布任务时自定义的数据
*/
public function fire(Job $job,$data)
{
$isJobDone = $this->doHelloJob($data);
if ($isJobDone) {
// 如果任务执行成功, 记得删除任务
$job->delete();
print("<info>Hello Job has been done and deleted"."</info>\n");
}else{
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
$job->delete();
}
}
}
/**
* 根据消息中的数据进行实际的业务处理...
*/
private function doHelloJob($data)
{
print("<info>Hello Job is Done!"."</info> \n");
return true;
}
} 最佳答案