守护程序知识

2023-06-24  本文已影响0人  Amy1234567

什么是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()

    {

        //

    }

}

上一篇 下一篇

猜你喜欢

热点阅读