您的位置:首页 > 编程语言 > PHP开发

laravel通过supervisor管理beanstalkd任务队列

2016-11-20 23:05 579 查看
.env文件中设置队列驱动为数据库

QUEUE_DRIVER=beanstalkd

安装beanstalkd

brew install beanstalkd

启动beanstalkd

brew services start beanstalkd

cd到项目目录

composer安装pheanstalk组件

composer require pda/pheanstalk

安装beanstalk_console用来查看beanstalkd的状态

https://github.com/ptrofimov/beanstalk_console

composer create-project ptrofimov/beanstalk_console -s dev /Users/whoami/data/

cd /Users/whoami/data/beanstalk_console

php -S localhost:5000 -t public

浏览器打开localhost:5000,查看beanstalk_console后台

mac安装supervisor

brew install supervisor

To have launchd start supervisor now and restart at login:

brew services start supervisor

Or, if you don't want/need a background service you can just run:

supervisord -c /usr/local/etc/supervisord.conf

Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.

For help, use /usr/local/bin/supervisord -h

解决办法:unlink supervisor.sock文件的位置

比如:unlink /usr/local/var/run/supervisor.sock

配置文件

/usr/local/etc/supervisord.conf

新建一个服务的配置

sudo vim /usr/local/etc/supervisor.d/laravel.conf

[program:laravel]

process_name=%(program_name)s_%(process_num)02d

; 命令,tries表示尝试最多3次

command=php /Users/allen/Documents/WorkSpace/laravel/artisan queue:work --tries=3 

autostart=true

autorestart=true

numprocs=8

redirect_stderr=true

; 日志文件路径

stdout_logfile=/Users/allen/Documents/WorkSpace/laravel/storage/logs/worker.log

启动

以下启动顺序由上到下优先级,依次递减

supervisord #默认去找$CWD/supervisord.conf,$CWD是当前目录,非必须设置supervisord

supervisord #默认$CWD/etc/supervisord.conf,也就当前目录下的etc目录

supervisord #默认去找/etc/supervisord.conf的配置文件

supervisord -c /usr/local/etc/supervisord.conf #到指定路径下去找配置文件

supervisor组件

supervisord

supervisord是supervisor的服务端程序。

作用:启动supervisor程序自身,启动supervisor管理的子进程,响应来自clients的请求,重启闪退或异常退出的子进程,把子进程的stderr或stdout记录到日志文件中,生成和处理Event

supervisorctl

这东西还是有点用的,如果说supervisord是supervisor的服务端程序,那么supervisorctl就是client端程序了。supervisorctl有一个类型shell的命令行界面,我们可以利用它来查看子进程状态,启动/停止/重启子进程,获取running子进程的列表等等。。。最牛逼的一点是,supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。
相应的配置在[supervisorctl]块里面

Web Server

Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。配置在[inet_http_server]块里面

XML_RPC接口

这个就是远程调用的,上面的supervisorctl和Web Server就是它弄的

用 supervisorctl 查看已经被监控的program(注:直接用 supe
4000
rvisorctl 会提示:http://localhost:9001 refused connection)

sudo supervisorctl -c /usr/local/etc/supervisord.conf

程序执行时修改配置文件需要重写读取配置文件

sudo supervisorctl -c /usr/local/etc/supervisord.conf reread

更新进程

sudo supervisorctl -c /usr/local/etc/supervisord.conf update

有几个配置项值得解释一下,可以根据需要自行设置。

stopasgroup=true。这一配置项的作用是:如果supervisord管理的进程px又产生了若干子进程,使用supervisorctl停止px进程,停止信号会传播给px产生的所有子进程,确保子进程也一起停止。这一配置项对希望停止所有进程的需求是非常有用的。

autostart=true。这一配置项的作用是:当启动supervisord的时候会将该配置项设置为true的所有进程自动启动。

【启动supervisord】

确保配置无误后可以在每台主机上使用下面的命令启动supervisor的服务器端supervisord,自动启动所有的进程

supervisord

【停止supervisord】

supervisorctl shutdown

【重新加载配置文件】

supervisorctl reload

【进程管理】
启动supervisord管理的所有进程

supervisorctl start all
停止supervisord管理的所有进程

supervisorctl stop all
启动supervisord管理的某一个特定进程

supervisorctl start program-name // program-name为配置项中的process_name,默认为[program:xx]中的xx

如:supervisorctl start laravel:laravel_00
停止supervisord管理的某一个特定进程

supervisorctl stop program-name // program-name为配置项中的process_name,默认为[program:xx]中的xx

如:supervisorctl stop laravel:laravel_00
重启所有进程或所有进程

supervisorctl restart all // 重启所有

supervisorctl reatart program-name // 重启某一进程,program-name为配置项中的process_name,默认为[program:xx]中的xx

如:supervisorctl reatart laravel:laravel_00
查看supervisord当前管理的所有进程的状态

supervisorctl status

【遇到问题及解决方案】

在使用命令supervisorctl start all启动控制进程时,遇到如下错误

unix:///tmp/supervisor.sock no such file

出现上述错误的原因是supervisord并未启动,只要在命令行中使用命令sudo supervisord启动supervisord即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  supervisor beanstalkd