0

我想实现这一点:

如果守护进程获得 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。有没有办法让它也适用于那个版本?

谢谢!

罗尼

4

2 回答 2

0

PHP 中的信号处理程序不可重入。因此,您从信号处理程序中派生/派生的任何进程本身都无法响应信号。如果该确切代码在 PHP 5.2.9 中有效,我很想查看详细信息,因为据我所知,这种行为是一致的。

所以,你可以做什么?

在许多情况下,最好的选择是在应用程序中定期轮询的信号处理程序中设置一个 $signal_recd 标志。

我是一个相当流行的 PHP 守护程序库的作者,https://github.com/shaneharter/PHP-Daemon

如果我是你,我会在上面构建你的应用程序,让它担心自动重启等。但如果没有别的,你可能可以看看它的 Core_Daemon::auto_restart() 和信号处理代码。

于 2012-08-25T02:11:48.833 回答
-1

我怀疑这是 PHP 中的一个错误。我仍在尝试绝对肯定地确认,但就目前而言,我们遇到了同样的问题。

如果您启动子进程并发送信号,子进程将接收并处理信号。如果您随后从父脚本重新启动另一个子进程并跟进另一个信号,则子进程不会收到第二个信号。我已经在 PHP 5.3.10 中进行了调整、旋转和辛勤工作以找到解决此问题的方法,但无济于事。

于 2012-03-15T21:40:11.177 回答