pcntl_signal不是由子进程触发的

时间:2011-05-12 13:06:05

标签: php pcntl

我想实现这个目标:

如果守护进程获得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。有没有办法让它在该版本上也有效?

谢谢!

罗尼

2 个答案:

答案 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中,我已经进行了调整,整理和努力以找到解决此问题的方法,但无济于事。