.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(注:直接用 supervisorctl 会提示: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即可。