相关文章
使用Redis实现队列
背景
前面实现了三种的队列方式,使用命令
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
因为我是使用homestead环境,自带的有supervisor,所以执行命令后,提示已经安装;
apt-cache show supervisor
查看已经安装的版本
二,创建配置并配置
- 创建配置文件
进入目录** 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 supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
或者使用:
sudo supervisorctl -c /etc/supervisor/supervisord.conf
使用supervisor
启动后,就安心了,你可以执行你的代码,这时候你会发现,不用输入artisan,队列也在运行
此时,你也可以查看运行的进程数
sudo supervisorctl status
因为我的配置numprocs=8,所以这里可以看出有8个进程在运行;
额外一句,可以通过命令sudo ps -aux|grep supervisor* 查看supervisor相关运行的端口号