使用supervisor管理laravel队列

相关文章
使用Redis实现队列

使用Databse实现队列

背景

前面实现了三种的队列方式,使用命令

php artisan queue:work
可以启动队列

但是在项目运行中,会发现queue: listen是线性的,就说执行完一个才会执行下一个,这样并不能满足我们日常的异步耗时任务处理的需求,于是有人建议启动多个queue:listen
php artisan queue:listen && php artisan queue:listen …
这样虽然理论上是可行的,因为在异步队列的帮助下,程序并不会出现冲突。但是由于PHP本身对内存处理的缺陷,很难保证一个长期运行在后台的程序不出现内存泄露,例如queue:listen这样的死循环程序。因此在正式环境中我们更倾向于使用多个queue:work并行执行异步队列中的任务。queue:work只是读取队首的一项任务,执行完成后即结束程序,如果没有任务也会结束程序。这个方式类似于PHP对于WEB请求的处理,不会出现内存泄露。

利用Supervisor可以便捷的创建基于queue:work的异步队列并行处理

supervisor简介

Supervisor是是一个进程控制系统,由python编写,它提供了大量的功能来实现对进程的管理。

  • 程序的多进程启动,可以配置同时启动的进程数,而不需要一个个启动
  • 程序的退出码,可以根据程序的退出码来判断是否需要自动重启
  • 程序所产生日志的处理
  • 进程初始化的环境,包括目录,用户,umask,关闭进程所需要的信号等等
  • 手动管理进程(开始,启动,重启,查看进程状态)的web界面,和xmlrpc接口
一,安装

sudo apt-get install supervisor
或官网一样:
pip install supervisor

pip安装教程

因为我是使用homestead环境,自带的有supervisor,所以执行命令后,提示已经安装;

apt-cache show supervisor
查看已经安装的版本

使用supervisor管理laravel队列_第1张图片

二,创建配置并配置
  • 创建配置文件
    进入目录== cd /etc/supervisor/conf.d==,创建配置文件

    sudo vim laravel-worker.conf

[program:laravel-worker]   //这里要保持你的进程名字与你的文件名字一致
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/code/my-project-name/artisan queue:listen --tries=3  //指定监听某个项目的artisan命令,并设置某一个队列执行失败重试3次
autostart=true    //默认随supervisord自动启动,默认true
autorestart=true // whether/when to restart (default: unexpected)
numprocs=8 //默认启动的进程数目,默认为1
redirect_stderr=true //标准错误重定向到标准输出,默认false
stdout_logfile=/home/vagrant/code/my-project-name/storage/logs/worker.log //设置队列执行中产生的工作日志存储路径
  • 重新加载配置并启动

sudo supervisor reread
sudo supervisor update
sudo supervisor start laravel-worker:*
或者使用:
sudo supervisord -c /etc/supervisor/supervisord.conf

使用supervisor管理laravel队列_第2张图片

使用supervisor

启动后,就安心了,你可以执行你的代码,这时候你会发现,不用输入artisan,队列也在运行
此时,你也可以查看运行的进程数

sudo supervisorctl status

使用supervisor管理laravel队列_第3张图片
因为我的配置numprocs=8,所以这里可以看出有8个进程在运行;
额外一句,可以通过命令sudo ps -aux|grep supervisor* 查看supervisor相关运行的端口号

你可能感兴趣的:(Homestead,laravel,队列,lavarel)