如何在不將簡單的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
您正在使用HTTP啓動守護進程嗎?這沒有任何意義,通過CLI啓動腳本,如果必須通過套接字和信號「交談」。 – 2014-12-06 02:41:07
如果我想使用套接字管理守護進程,那麼我必須創建套接字服務器並打開一些端口來與它進行通信。我認爲這不安全。該解決方案還添加了另一個抽象的「談話」層,並且不適合。 – Slam 2014-12-06 12:36:29