守护程序知识
什么是supervisor?
supervisor是linux系统中常用的进程守护程序,当队列进程queue:work意外关闭,它会重新启动队列程序。
怎么安装supervisor?
在ubuntu安装Supervisor非常简单:
sudo apt-get install supervisor
注:如果自己配置Supervisor有困难,可以考虑使用laravel forge, 它会为Laravel项目自动安装并配置Supervisor
怎么配置supervisor?
supervisor配置文件通常存放在/etc/supervisor/conf.d目录,在该目录下,可以创建多个配置文件指示supervisor如何监控进程的,例如,让我们创建一个开启并监控queue:work的laravel-worker.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
numprocs指令让supervisor运行8个queue:work进程并监视它们,如果失效的话重新启动。当然,你需要修改queue:work sqs的command指令来映射你的队列连接。
怎么启动supervisor?
成功配置文件后,需要刷新supervisor的配置信息并使用如下命令启动进程:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
如何处理失败队列?
不可避免会出现运行失败的任务。laravel可以轻松设置任务运行的最大尝试次数,若是执行次数达到限定,该任务会被插入到failed_jobs表,要创建一个failed_jobs表的迁移,可以使用queue:failed-table命令
php artisan queue:failed-table
php artisan migrate
然后,运行队列进程时,通过--tries参数项来设置任务允许的最大尝试次数,如果没有指定--tries选项的值,任务会被无限期重试:
php artisan queue:work redis --tries=3
怎么清除失败队列?
可以在任务类中定义failed方法,从而允许你在失败发生时执行指定的动作,比如发送失败队列通知,记录日志等等。导致任务失败的Exception会被传递到failed方法:
<?php
namespace App\Jobs;
use Exception;
use App\Podcast;
use App\AudioProcessor;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessPodcast implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
protected $podcast;
/**
* Create a new job instance.
* @param Podcast $podcast
* @return void
*/
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
/**
* Execute the job.
* @param AudioProcessor $processor
* @return void
*/
public function handle(AudioProcessor $processor)
{
// Process uploaded podcast...
}
/**
* The job failed to process.
* @param Exception $exception
* @return void
*/
public function failed(Exception $exception)
{
// 发送失败通知, etc...
}
}
怎么重试失败队列?
要查看已插入到failed_jobs数据表中的所有失败队列,可以使用Artisan命令queue:failed
php artisan queue:failed
该命令会列出任务ID,连接,队列和失败时间,任务ID可用于重试失败任务,例如要重试一个ID为5的失败任务,可以运行下面的命令:
php artisan queue:retry 5
要重试所有失败任务,运行如下命令:
php artisan queue:retry all
如果要删除一个失败任务,可以使用queue:forget 命令:
php artisan queue:forget 5
要删除所有失败任务,可以使用queue:flush命令:
php artisan queue:flush
什么是任务事件?
通过queue门面提供的before和after方法可以在任务被处理之前或之后指定要执行的回调。这些回调可用来记录日志或者记录统计数据。通常,你可以在服务提供者中使用这些方法。比如,我们可能在AppServiceProvider这样用:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
* @return void
*/
public function boot()
{
Queue::before(function (JobProcessing $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});
}
/**
* Register the service provider.
* @return void
*/
public function register()
{
//
}
}