我想实现这个目标:
如果守护进程获得SIGHUP而不是再次运行该进程(作为子进程)并终止该进程。
当我正在运行时,第一次正在运行:
> php test.php
> kill -HUP pid
> ps -ef |grep test.php
> result:... newPID test.php
问题是,如果现在我正在杀死子进程,则不会触发该函数
> kill -HUP newPID
> ps -ef |grep test.php
> result: ... newPID(the same) test.php
代码:
test.php:
<?php
declare(ticks = 1);
$mypid = posix_getpid();
function sig_handler()
{
Global $mypid;
echo "Received sighup, we need to reload ourselves now \n";
echo "mypid:$mypid \n";
system("(php test.php)>/dev/null &");
posix_kill($mypid,9);
}
pcntl_signal(SIGHUP, "sig_handler");
sleep(500);
?>
此代码适用于PHP 5.2.9,但不适用于PHP 5.3.5。有没有办法让它在该版本上也有效?
谢谢!
罗尼
答案 0 :(得分:0)
PHP中的信号处理程序不可重入。因此,您在信号处理程序中分叉/生成的任何进程本身都不能响应信号。如果确切的代码在PHP 5.2.9中有效,我很乐意看到详细信息,因为根据我的知识,这种行为是一致的。
那你能做什么?
在许多情况下,最好的选择是在您在应用程序中定期轮询的信号处理程序中设置$ signal_recd标志。
我是一个相当受欢迎的PHP守护程序库的作者,https://github.com/shaneharter/PHP-Daemon
如果我是你,我会建立你的应用程序并让它担心自动重启等等。但如果没有别的,你可以看看它的Core_Daemon :: auto_restart()和信号处理代码。
答案 1 :(得分:-1)
我怀疑这是PHP中的一个错误。我仍然试图绝对肯定地确认,但是现在我们遇到了同样的问题。
如果您启动子进程并发送信号,则子进程将接收并处理该信号。如果您随后从父脚本重新启动另一个子进程并跟进另一个信号,则子进程不会收到第二个信号。在PHP 5.3.10中,我已经进行了调整,整理和努力以找到解决此问题的方法,但无济于事。