laravel_Supervisor队列

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 //修改代码后执行,队列才会读取新代码

 

上一篇:django – 无法执行gunicorn_start EACCES


下一篇:利用Supervisor 管理自己部署的应用程序