laravel队列
配置
- 配置文件 config/queue.php 中添加代码
env('QUEUE_CONNECTION', 'sync'),
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => env('QUEUE_TABLE', 'jobs'),
'queue' => 'default',
'retry_after' => 90,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
],
'sqs' => [
'driver' => 'sqs',
'key' => env('SQS_KEY', 'your-public-key'),
'secret' => env('SQS_SECRET', 'your-secret-key'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'),
'region' => env('SQS_REGION', 'us-east-1'),
],
'redis' => [
'driver' => 'redis',
'connection' => env('QUEUE_REDIS_CONNECTION', 'default'),
'queue' => 'default',
'retry_after' => 900,
'block_for' => null,
],
],
'failed' => [
'database' => env('DB_CONNECTION', 'mysql'),
'table' => env('QUEUE_FAILED_TABLE', 'failed_jobs'),
],
];
- 配置文件 config/database.php 中redis部分如下
env('DB_CONNECTION', 'mysql'),
'redis' => [
'client' => 'predis',
'cluster' => env('REDIS_CLUSTER', false),
'default' => [
'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
'password' => env('LIANSHAN_REDIS_PWD', null),
'port' => env('LIANSHAN_REDIS_PROT', 6379),
'database' => env('LIANSHAN_REDIS_DATABASE', 0),
],
'cache' => [
'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
'password' => env('LIANSHAN_REDIS_PWD', null),
'port' => env('LIANSHAN_REDIS_PROT', 6379),
'database' => env('LIANSHAN_CACHE_DB', 1),
],
],
];
- .env文件中 QUEUE_CONNECTION=redis 有4种驱动选择,对应上步中的配置 默认是sync,即同步的,直接处理,无队列
- 对应的mysql中有 jobs 与 failed_jobs 表,记录任务执行情况,对应配置文件的设置
迁移文件生成
jobs表
php artisan queue:table
失败任务表
php artisan queue:failed-table
- 如果选择redis驱动,需要安装 predis 类库包,低版本 lumen 需要安装 illuminate/redis
使用
// 生产者
use App\Jobs\VideoReportJob;
dispatch((new VideoReportJob($param1, $param2))->onQueue('queue1'));
// 消费者
param1 = $param1;
$this->param2 = $param2;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// 耗时的任务内容
sleep(50);
}
public function failed()
{
// 任务执行失败,超时,代码报错拦截处理
}
}
// 启动队列
php artisan queue:work --queue=queue1
执行失败的任务会在 config/queue.php 中配置的表中记录 默认是 failed_jobs 表
超时配置
config/queue.php 中的 retry_after ,该配置项的目的是定义任务在执行以后多少秒后释放回队列。如果retry_after设定的值为90, 任务在运行90秒后还未完成,那么将被释放回队列而不是删除掉,将会再次执行
消费者中的 timeout 控制队列进程执行每个任务的最长时间,如果超时,该进程将被关闭
配置项retry_after 和 Aritisan 参数项--timeout不同,但目的都是为了确保任务的安全,并且只被成功的执行一次。参数项--timeout的值应该是中小于配置项retry_after的值,这是为了确保队列进程总在任务重试以前关闭。如果--timeout比retry_after大,则你的任务可能被执行两次。
例如比如说你把 retry_after 设置为 20,好,假设现在有一个 job 它需要耗费 15 到 25 秒不等的时间来完成,假设处理 job 的那个程序在处理到第 20 秒还没完成时,它就不继续处理了,把这个 job 放回任务队列中,然后再尝试处理(retry),这次运气好,它处理到 17 秒就完成了,那就完事了,接着处理下一个 job