管理php守护进程
问题描述:
如何在不将简单的cli运行时改为php-fpm的情况下从web管理守护进程?管理php守护进程
在OS启动后,守护进程会自动启动,并在不使用php-fpm池的情况下作为cli应用程序工作。所以守护进程生态系统的基本思想是不用php-fpm pool(CLI-SAPI)。
服务器配置:
- 的Debian 7
- 阿帕奇2.2
- 的php5-FPM(V 35年4月5日) - 的mod_fastcgi
- daemon.php
- daemon_manager.php - 管理脚本从命令行启动|停止|重新启动|终止daemon.php。
- daemon_manager_web.php - 用于管理来自浏览器的守护程序的管理员脚本。
daemon.php是一个普通的PHP后台程序是这样的:
<?php
declare(ticks=1);
ini_set("max_execution_time", "0");
ini_set("max_input_time", "0");
set_time_limit(0);
/* Catching signals */
function sig_handler($signo) {
switch ($signo) {
case SIGQUIT:
case SIGTERM:
// some work
pcntl_wait($status);
break;
//...
}
}
pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGQUIT, 'signal_handler');
$newpid = pcntl_fork();
if ($newpid == -1) {
throw new Exception('Cannot fork porcess');
} elseif ($newpid) {
print "Starting daemon under pid=$newpid\n";
// ...
exit;
}
的问题。
由于PCNTL函数不能从Web获得,我通过exec(),shell_exec()等函数管理守护进程。但是当我停止并从浏览器中使用daemon_manager_web.php再次启动守护进程时,它通常会启动,但是可以在php-fpm池下运行。
进程重新启动之前列表:
$ ps aux | grep php
root 5952 0.0 2.9 69008 14952 pts/0 S 14:24 0:00 php /var/www/daemon.php
$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
Loaded: loaded (/etc/init.d/php5-fpm)
Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/php5-fpm.service
├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
├ 9562 php-fpm: pool www
├ 9605 php-fpm: pool www
└ 9633 php-fpm: pool www
重启后的进程列表中的浏览器:
$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
Loaded: loaded (/etc/init.d/php5-fpm)
Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/php5-fpm.service
├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
├ 4987 php-fpm: pool www
├ 5040 php-fpm: pool www
├ 9432 php-fpm: pool www
└ 9492 /usr/bin/php /var/www/daemon.php
答
你应该不以任何方式开始通过Apache守护进程。这样做的正确方法是启动一个守护进程(由supervisord管理,我在生产环境中拥有相当不错的记录)和opening a file socket(AF_UNIX),您在其上执行了socket_select()
以及空闲等待一些触发处理的输入。这样,“接口”(在Apache上)就连接到套接字并写入它。
关于该主题,我发现在PHP中编写守护程序非常繁琐,您可能希望选择一个库来处理您的基本问题(无法推荐任何内容)或甚至更适合该事件的其他工具典型的守护进程循环(node.js?)
您正在使用HTTP启动守护进程吗?这没有任何意义,通过CLI启动脚本,如果必须通过套接字和信号“交谈”。 – 2014-12-06 02:41:07
如果我想使用套接字管理守护进程,那么我必须创建套接字服务器并打开一些端口来与它进行通信。我认为这不安全。该解决方案还添加了另一个抽象的“谈话”层,并且不适合。 – Slam 2014-12-06 12:36:29