驱动器设置
驱动器使用MySQL表的可以参考手册
这里我使用的是redis,在设置queue之前,我们在数据库配置文件中新加一个connection ,原因是我想让队列任务单独使用一个库。
之后,修改驱动文件 queue
这里queue参数是指默认的队里名称,retry_after 这个选项指定了任务最多处理多少秒后就被当做失败重试了。
配置完后,修改配置文件.env的queue驱动为redis
生成任务类,建议使用命令生成
php artisan make:job UpdateUserBehaviorShence
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
class UpdateUserBehaviorShence implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* 任务最大尝试次数。
* 参数指定任务的最大重试次数。如果不指定,任务就会永久重试
* 当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面
* @var int
*/
public $tries = 5;
/**
* 任务运行的超时时间。
* 队列处理器最多执行多长时间后就应该被关闭掉
* @var int
*/
public $timeout = 120;
public $a,$b,$c;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($a,$b,$c)
{
//
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$sss = [
'ar' => $this->a,
'br' => $this->b,
'cr' => $this->c
];
//加载神策类,执行神策代码
Log::info(json($sss));
}
/**
* 要处理的失败任务。
*
* @param Exception $exception
* @return void
*/
public function failed(\Exception $e)
{
// 给用户发送失败通知,等等...
var_dump([
'title' => 'shence:upuserd',
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'msg' => $e->getMessage(),
'time' => date('Y-m-d H:i:s',time()),
]);
Log::info([
'title' => 'shence:upuserd',
'code' => $e->getCode(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'msg' => $e->getMessage(),
'time' => date('Y-m-d H:i:s',time()),
]);
}
}
这个任务类我故意留了一个错误,让任务不能正常执行
下边在action中,分发任务,这个action的路由自定义
$iUserId = '234';
$sClientType = 'sClientType';
$sLoginType = 'sLoginType';
$event = 'login';
\App\Jobs\UpdateUserBehaviorShence::dispatch($iUserId, $sClientType, $sLoginType)
// ->onConnection('shenceconn')
->onQueue('shence');
刷新action分发任务。。。。。
刷新之后我们连接redis,并选择数据库,这里我用的第四个库
redis-cli -h 127.0.0.1 -p 6379
select 3
查看没有执行的队列数据
LRANGE "queues:shence" 0 -1
现在队里中已经有还没有被执行的任务了。。
接下来运行队列处理器
php artisan queue:work redis --queue=shence --timeout=60 --sleep=3 --tries=2
执行队列报错的话会写入数据表failed_jobs中
这个ID 等于3的记录就是新生成的错误队列信息,这个表中exception字段记录了错误原因
我们可以执行一系列命令对错误的队列进行重置、查看、删除等处理
使用php artisan queue:failed 查看错误队列信息
将第二条重新放回未执行队列队列中
php artisan queue:retry 2
再次查看
2被放回之后只剩3
查看redis中的队列
我们再把3放回去再次查看redis队列
现在是2条了,具体详细的命令可以参考手册,手册很详细。。
通过这个小测试,理解下laravel队列的工作流程。。