Laravel 队列系统实现(二) Supervisor

上一节,已经队列任务类已经成功创建了;
但是上节遗留下来的问题;
问题 :
在我们真实的开发过程中;
不可能一直开着这个命令行这个窗口;
里面运行着 php artisan queue:work 这个命令吧;
这时就需要 搭建进程守护了;
接下来我们会需要下载一个进程守护的软件supervisor;
supervisor使用python(现在在自学的一门语言)开发的一个client/server服务;
是linux/unix系统下的一个进程管理工具;
它可以很方便的监听、停止、重启一个或多个进程;
用supervisor管理的进程,打你个进程意外被杀死;
supervisor监听到进程死后,会自动将它重新拉起,很方便的做到自动恢复的功能;
不再需要自己写shell脚本控制;
它就是会自动执行你所写的命令;
神不神奇;
(╥╯^╰╥)
今天会下载两个版本的supervisor;
一个是Centos 的安装方式;
还有一个是他的好兄弟ubuntu;
废话不多说,直接上干货;
首先是ubuntu版的安装方式;
其实都大同小异;

ubuntu

sudo apt-get install supervisor //ubuntu 命令安装 supervisor

出现一下代码,就说明安装成功;

vagrant@homestead:/vagrant/api$ sudo apt-get install supervisor
Reading package lists... Done
Building dependency tree
Reading state information... Done
supervisor is already the newest version (3.2.0-2ubuntu0.1).
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

Supervisor 的配置文件通常位于 /etc/supervisor/conf.d 目录下;
在该目录中,你可以创建任意数量的配置文件,用来控制 supervisor 将如何监控你的进程;

cd /etc/supervisor/conf.d //进入到这个目录
ls //发现什么也没有

这时我们需要创建新的配置文件;

vim laravel-worker.conf //创建文件laravel-worker.conf文件

把以下代码粘贴进来,稍作修改就可以了;

[program:laravel-worker] //program这个参数必须和文件名保持一致
process_name=%(program_name)s_%(process_num)02d
command=php /vagrant/api/artisan queue:work --queue=default --tries=3 --daemon //运行程序的命令
autostart=true //程序意外退出是否自动重启
autorestart=true //是否自动启动
user=www //进程执行的用户身份
numprocs=8 //表示启动多少个进程来监听 Laravel 队列
redirect_stderr=true //这个参数具体是把 生成的信息 放在下面的日志文件当中
stdout_logfile=/vagrant/api/storage/logs/worker.log //生成进程日志的地方 , 这里我把他放到了项目目录的storage下面

wq 配置完成之后;
我们需要执行一下命令,更新一下配置文件;

vagrant@homestead:/etc/supervisor/conf.d$ sudo supervisorctl reread //重新读取配置文件
laravel-worker: changed

上面出现 changed重新读取成功;
重新读取配置文件之后;
我们需要更新supervisorctl进程;

vagrant@homestead:/etc/supervisor/conf.d$ sudo supervisorctl update //更新supervisorctl进程
laravel-worker: stopped
laravel-worker: updated process group

接下来我就可以启动程序;

sudo supervisorctl start laravel-worker:*

这时候我们就不需要在命令行当中去敲 php artisan queue:work 这个命令了;
这时候我们再次请求一下路由;
请求路由
出现yes 字符;
然后我们在打开日志文件;

[2019-07-28 19:57:16] local.INFO: TestJob poset title is {"id":1,"name":"\u524d\u53f0\u7f51\u7ad9"}  
[2019-07-28 19:57:16] local.INFO: TestJob poset title is {"id":48,"name":"\u6559\u80b2\u4ea7\u54c1\u5e93"}  
[2019-07-28 19:57:16] local.INFO: TestJob poset title is {"id":65,"name":"\u56fe\u4e66\u4f01\u4e1a\u7248"}

注意我没有运行 php artisan queue:work 命令;
日志就直接出现了;
神不神奇;

Centos

安装 Supervisor;

yum install python-setuptools
easy_install supervisor

或者easy_installbuhaoz不好使;

如果easy_install不好使就从官方下载:
wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz
然后通过python安装:
tar zxf supervisor-3.3.1.tar.gz
cd supervisor
python setup.py install

如下提示,说明安装完成:

Installed /usr/lib/python2.7/site-packages/meld3-1.0.2-py2.7.egg
Finished processing dependencies for supervisor

创建文件夹和配置文件;
对比之前ubuntu我们是不需要创建文件夹的;
没有对比就没有伤害;
还是ubuntu安装简单啊;

mkdir /etc/supervisor //创建文件夹
echo_supervisord_conf > /etc/supervisor/supervisord.conf //生成supervisor配置文件

修改/etc/supervisor/supervisord.conf文件内容

vim /etc/supervisor/supervisord.conf

在文件的结尾处添加如下代码:

[include]
files = conf.d/*.conf //引入配置文件

执行一下命令,是配置文件生效;

[root@VM_0_7_centos /]# supervisorctl reload
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224

如果爆以上的错误,没有关系;
是因为我们没有开启supervisorctl 进程;
执行重新命令肯定会失败的啊;
可以先不管这个报错;
接下来在/etc/supervisor/下创建conf.d文件夹,及ProjectName.conf(最好以项目名称命名的,以便于区分);
cd /etc/supervisor 进入到目录里面;

mkdir conf.d //创建conf.d目录

这些操作都与ubuntu的类似;
只不过centos,需要手动创建文件夹和文件;
cd conf.d 进入到目录里面;
创建配置文件;

vim laravel-worker.conf //创建文件laravel-worker.conf文件

与ubuntu的一样;

[program:laravel-worker] //program这个参数必须和文件名保持一致
process_name=%(program_name)s_%(process_num)02d
command=php /vagrant/api/artisan queue:work --queue=default --tries=3 --daemon //运行程序的命令
autostart=true //程序意外退出是否自动重启
autorestart=true //是否自动启动
user=www //进程执行的用户身份 需要确保你的用户是否存在,不然会报错
numprocs=8 //表示启动多少个进程来监听 Laravel 队列
redirect_stderr=true //这个参数具体是把 生成的信息 放在下面的日志文件当中
stdout_logfile=/vagrant/api/storage/logs/worker.log //路径必须存在,生成进程日志的地方 , 这里我把他放到了项目目录的storage下面

注意:再复制laravel-worker.conf文件内容时 , 把注释去掉;
不然会报错;
wq 配置完成之后;
运行supervisord,查看是否生效,执行以下命令:

supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep laravel-worker

如果出现一下提示 , 说明运行成功;

[root@VM_0_7_centos conf.d]# ps -ef | grep laravel-worker
root     26211 22208  0 21:02 pts/0    00:00:00 grep --color=auto laravel-worker

运行成功之后它就会在后台默默的执行 php artisan queue:work命令

静静的看着 好好学习 , 天天线上;

supervisor拓展:

sudo service supervisor stop //停止supervisor服务
sudo service supervisor start //启动supervisor服务
supervisorctl shutdown //关闭所有任务
supervisorctl stop|start program_name //启动或停止服务
supervisorctl status //查看所有任务状态

注意:
laravel job 走的是常驻内存的形式;
所以每次改动代码了;
重启守护进程:
supervisor restart;
重启laravel队列服务:
php artisan queue:restart;

史大坨博客
请先登录后发表评论
  • 最新评论
  • 总共1条评论
史大坨博客

baijunyao:亲; debugbar 没有关哈; 会暴露一些安全信息; 把 .env 中的 DEBUGBAR_ENABLED 设置为 false ; 可以参考: https://baijunyao.com/docs/laravel-bjyblog/部署到生产环境.html

2019-09-01 10:40:56 回复

史大坨博客
  • 史大坨 回复 baijunyao:嗯嗯 好的 谢谢  感谢大神的光临 
  • 2019-09-06 13:00:08 回复