laravel队列之Supervisor守护进程(ubuntu篇)

前言

众所周知,队列的开启为:php artisan queue:work,但是一旦关闭命令窗口队列运行就关闭。因此官方推荐Supervisor。具体安装配置使用教程可以参考官方文档
但是本着兼听则明的原则,还有没有其他可行的方式呢?于是查到一些资料,根据这篇文章:laravel队列常驻运行问题的说法,还可以通过运行php artisan queue:work --daemon
看到这里,我不禁拍案而起,大呼一声“妙啊”,但是根据另外一篇文章laravel队列常驻运行问题里一个大佬说的:
“只是放到后台运行而已,如果队列出现致命错误,队列必然挂彩,唯一的解决方法就是通过进程守护的方式实现重启(supervisord)。只要supervisord进程存在,你的队列就能永久的常驻进程。另外,supervisord貌似只支持linux”
然后通过查阅资料发现:

  • queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
  • queue:listen 监听队列请求, 只要运行着, 就能一直接受请求, 除非手动终止;
  • queue:work --daemonlisten 一样, 只要运行着, 就能一直接受请求, 不一样的地方是在这个运行模式下, 当新的请求到来的时候, 不重新加载整个框架, 而是直接 fire 动作.
    能看出来, queue:work --daemon 是最高级的, 一般推荐使用这个来处理队列监听.

    注意: 使用 queue:work --daemon , 当更新代码的时候, 需要停止, 然后重新启动, 这样才能把修改的代码应用上.

综合上述也就是说平时使用没啥问题,但是遇到致命错误,队列会挂掉,但是如果使用Supervisor,队列挂了,会重新开启。于是决定来跳这个坑。

开始

根据文档,各种安装步骤省略,但是在开启的时候遇到很多问题。
问题:

然后查阅以后发现了这篇文章:使用 Supervisor 管理 Laravel 队列进程,发现了是在/etc/supervisord/conf.d中的配置文件中指向的Log文件权限不够,以及配置的问题。
laravel-work.conf配置文件:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
//指向的是需要执行的项目的队列,等同于进入/home/vagrant/code/dcat目录再执行:
//php artisan queue:work redis --sleep=3 --tries=3,原配置中redis为sqs,这个是
//队列的连接,你用什么队列就改什么,redis就是redis,rebbitmq就为rebbitmq
command=php /home/vagrant/code/dcat/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600

然后chmod -R 777 /home/forge/app.com/worker.log

还有一个地方,就是/etc/supervisord/下的supervisord.conf的一个配置项:
[include] files = /etc/supervisor/conf.d/*.conf
它的意思是指向conf.d下的配置文件,上一篇文章的配置一样,根据具体情况配置即可。
然后开启:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

如果执行到最后一步没有报错且没有

laravel-worker:laravel-worker_00: started

的提示信息,那就执行:

sudo supervisorctl status

查看队列是否开启,如果显示:

laravel-worker:laravel-worker_00   RUNNING   pid 3937, uptime 0:05:37
laravel-worker:laravel-worker_01   RUNNING   pid 3938, uptime 0:05:37
laravel-worker:laravel-worker_02   RUNNING   pid 3939, uptime 0:05:37
laravel-worker:laravel-worker_03   RUNNING   pid 3940, uptime 0:05:37
laravel-worker:laravel-worker_04   RUNNING   pid 3941, uptime 0:05:37
laravel-worker:laravel-worker_05   RUNNING   pid 3942, uptime 0:05:37
laravel-worker:laravel-worker_06   RUNNING   pid 3943, uptime 0:05:37
laravel-worker:laravel-worker_07   RUNNING   pid 3944, uptime 0:05:37

那么恭喜你,你的队列开启成功。

使用

控制器:

use App\Jobs\FlowQueue;
$user = [
    'uid'=>1,
    'name'=>'李大',
    'phone'=>'1388888888',
    'score'=>[
        'chinese'=>(double)110,
        'math'=>(double)100,
        'english'=>(double)90,
    ],
    'type'=>2
];
FlowQueue::dispatch($user);

队列:

class FlowQueue implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $accessLogs;

    /**
     * Create a new job instance.
     *
     * @param AccessLog $accessLogs
     */
    public function __construct($accessLogs)
    {
        //
        $this->accessLogs = $accessLogs;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        $logs = $this->accessLogs;
        AccessLog::create($logs);
    }
}

执行结果:

(请忽略mongodb时间差8小时问题,解决办法就是在使用mongodb的模型加入这个:

use DateTimeInterface;
use Illuminate\Support\Carbon;
public function serializeDate(DateTimeInterface $date){
  return Carbon::instance($date)->toDateTimeString();
}

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

推荐使用 horizon,默认是后台执行 Horizon《Laravel 5.5 中文文档》

3年前 评论
她来听我的演唱会 (楼主) 3年前

--daemon : Run the worker in daemon mode (Deprecated)

3年前 评论
她来听我的演唱会 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!