前言
由于研发需要用到大量的后端服务,而PHP在后端服务的支撑上,存在一些天然的缺点,但是可以用第三方软件来弥补这些问题。
Supervisord
supervisord是一个进程管理工具,提供web页面管理,能对进程进行自动重启等操作。
它可以将非后台运行程序后台运行,并且自动监控,重启进程。但是不能管理后台运行程序。
宝塔面板
宝塔面板是一款服务器管理工具,适用于运维人员不足,但是对网络又有很多要求的一些公司。
Thinkphp
Thinkphp是一款MVC结构的开源PHP框架,但是也提供了对命令行(后台服务)的一些支持。
过程
在后台用thinkphp的客户端模式运行了一个swoole的服务,其中swoole服务的基本配置如下:
$config = array(
'worker_num' => 8,
'daemonize' => 1,
'max_request' => 1000,
'dispatch_mode' => 3,
'task_worker_num' => 10,
"task_ipc_mode" => 2,
"log_file" => "/var/log/swoole.log",
);
然后使用Thinkphp的命令行模式进行启动:
php think TestCommand
确定是没问题的。
然后进入宝塔面板,找到Supervisor项(在系统工具那里):
选择添加守护进程,选择启动,这个时候,你会发现总是报错,表现为FATAL或者BACKOFF,而在系统错误日志那里,则是swoole报错:
[Swoole\Exception]
failed to listen server port[0.0.0.0:9505], Error: Address already in use[98]
原因就在于swoole配置为了守护进程启动,而supervisor只适用于前台服务,导致不能发现后台进程的pid,所以不断重启swoole服务。
解决
既然supervisor已经提供了守护进程的功能,我们就关闭swoole的该选项,设置为:
$config = array(
'worker_num' => 8,
'daemonize' => 1,
'max_request' => 1000,
'dispatch_mode' => 3,
'task_worker_num' => 10,
"task_ipc_mode" => 2,
"log_file" => "/var/log/swoole.log",
);
然后再到宝塔面板后台,点击启动,就可以看到正常了:
在系统里通过:
ps -ef | grep testcommand
也能看到的服务:
root 395684 395648 0 17:37 ? 00:00:00 php think testcommand
接下来,我们测试一下,手动kill掉进程:
kill 395684
你会发现,supervisor会马上重启该服务。
总结
Supervisor提供了优秀的守护进程监控服务,使得我们在用脚本编写一些系统服务的时候,不用再去过多考虑服务僵死的情况,但是也要注意不要跟一些本身自带守护进程运行模式的服务冲突,比如Swoole。