奇步互动技术分享会

队列如何使用

2019-07-12  本文已影响9人  Yunchao

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 reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

sudo supervisorctl reload


处理失败的任务

//使用数据库database

php artisan queue:failed-table

php artisan migrate

上一篇下一篇

猜你喜欢

热点阅读