Queue
1. 队列驱动
//数据库驱动,修改.env的QUEUE_DRIVER QUEUE_DRIVER=database
1. 数据库表
php artisan queue:table php artisan queue:failed-table php artisan migrate
3.创建任务类
<?php namespace App\Jobs; use Illuminate\Support\Facades\Log; class LogTestJob extends Job { /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { sleep(5); for($i = 1; $i <= 10000; $i ++) { Log::info("--$i--"); } } }
1. 分发任务
<?php namespace App\Http\Controllers; use App\Jobs\LogTestJob; use Illuminate\Support\Facades\Queue; use Laravel\Lumen\Routing\Controller as BaseController; class TestController extends BaseController { /** * 测试队列任务分发 * @description * @author csl */ public function logTestJob(){ $job = (new LogTestJob())->onQueue('log');// 任务将被委派到 "log" 队列 dispatch($job); } }
1. 运行队列进程
//监听queue为"log"的队列 php artisan queue:work --queue=log //监听queue为"default"的队列,--queue默认为default php artisan queue:work //onQueue方法指定queue的名称 $job = (new LogTestJob())->onQueue('log');
1. 任务过期
`config/queue.php` 配置文件里,每一个队列连接都定义了一个 ` retry_after ` 选项。这个选项指定了任务最多处理多少秒后就被当做失败重试了。比如说,如果这个选项设置为 ` 90 `,那么当这个任务持续执行了 ` 90 ` 秒而没有被删除,那么它将被释放回队列。通常情况下,你应该把 `retry_after` 设置为最长耗时的任务所对应的时间。
1. 任务超时
` queue:work ` Artisan 命令对外有一个 ` --timeout ` 选项,默认60秒。这个选项指定了 `Laravel` 队列处理器最多执行多长时间后就应该被关闭掉。有时候一个队列的子进程会因为很多原因僵死,比如一个外部的 HTTP 请求没有响应。这个 `--timeout` 选项会移除超出指定事件限制的僵死进程。
<?php namespace App\Jobs; class ProcessPodcast implements ShouldQueue { /** * 任务运行的超时时间。 * * @var int */ public $timeout = 120; } 或 php artisan queue:work --timeout=120
` retry_after ` 配置选项和 ` --timeout` 命令行选项是不一样的,但是可以同时工作来保证任务不会丢失并且不会重复执行。
` --timeout ` 应该永远都要比 ` retry_after` 短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的 `--timeout` 选项大于 `retry_after` 配置选项,你的任务可能被执行两次。
1. 配置Supervisor
**安装Supervisor**
Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。在 Ubuntu 安装Supervisor 非常简单:
sudo apt-get install supervisor
**配置Supervisor**
Supervisor 配置文件通常存放在 ` /etc/supervisor/conf.d ` 目录,在该目录中,可以创建多个配置文件指示 `Supervisor` 如何监视进程,例如,让我们创建一个开启并监视`queue:work` 进程的 BBB_log_queue.log 文件:
[program:BBB_log_queue] process_name=%(program_name)s_%(process_num)02d command=php /home/chaishuliang/www/BBB/artisan queue:work --queue=log --delay=5 --sleep=3 --tries=3 autostart=true autorestart=true ;user=forge numprocs=5 redirect_stderr=true stdout_logfile=/home/chaishuliang/www/supervisor/stdout_log/BBB_log_queue.log
**启动Supervisor**
当你成功创建配置文件后,你需要刷新 Supervisor 的配置信息并使用如下命令启动进程:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start BBB_log_queue:* //Start all processes in a group,BBB_log_queue共5个进程(numprocs) 或 sudo supervisorctl start all
1. 队列处理器 & 部署
因为队列处理器都是 long-lived 进程,如果代码改变而队列处理器没有重启,他们是不能应用新代码的。所以最简单的方式就是重新部署过程中要重启队列处理器。你可以很优雅地只输入 `queue:restart` 来重启所有队列处理器。
php artisan queue:restart //修改代码后执行,队列才会读取新代码