队列如何使用
Laravel 队列为不同的后台队列服务提供统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间。
驱动的必要设置
Database //需要数据表来存储,可以用artisan生成
php artisan queue:table
php artisan migrate
Redis
为了使用 redis 队列驱动,你需要在 config/database.php 配置文件中配置 Redis 的数据库连接。
创建任务
生成任务类:php artisan make:job ProcessPodcast // app/Jobs文件夹下
任务类__construct 方法 传递对象属性
任务类handle方法 处理具体任务
分发任务
一旦你写完了你的任务类你就可以使用它自带的 dispatch 方法分发它。传递给 dispatch 方法的参数将会被传递给任务的构造函数:
ProcessPodcast::dispatch($podcast);//分发到配置的default的队列中
ProcessPodcast::dispatch($podcast) ->delay(now()->addMinutes(10));//延时10分钟发布
ProcessPodcast::dispatch($podcast)->onQueue('processing');// 分发任务到指定队列(processing)
ProcessPodcast::dispatch($podcast)->onConnection('sqs');//分发任务到指定连接(sqs)
public $tries = 5;//任务可以尝试的最大次数。
public function retryUntil(){ return now()->addSeconds(5);}/** 定义任务超时时间 , 在该时间内无限次尝试*/
运行队列处理器
php artisan queue:work //监听所有链接的default队列
php artisan queue:work --once // 执行单一任务
php artisan queue:work redis // 指定连接
php artisan queue:work redis --queue=emails //指定队列
php artisan queue:work --queue=high,low //队列优先级,high 与low 都是队列名
php artisan queue:restart // 重启
php artisan queue:work --sleep=3 //队列进程睡眠时间
如果指定非default的队列,需要执行指定队列的命令来运行
Supervisor 配置
sudo apt-get install supervisor //linux 安装
一般 Supervisor 的配置文件存储在 /etc/supervisor/conf.d 目录
cd /etc/supervisor/conf.d
vim laravel-worker.conf
//conf文件内容
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
//启动supervisor
sudo supervisorctl rereadsudo supervisorctl update
sudo supervisorctl start laravel-worker:*
sudo supervisorctl reload
处理失败的任务
//使用数据库database
php artisan queue:failed-table
php artisan migrate