pcntl_signal не запускается дочерним процессом - PullRequest
0 голосов
/ 12 мая 2011

Я хочу добиться этого:

если демон получает 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. Есть ли способ заставить его работать и на этой версии?

Спасибо!

Ronny

Ответы [ 2 ]

0 голосов
/ 25 августа 2012

Обработчики сигналов в PHP не являются реентерабельными. Таким образом, любой процесс, который вы запускаете / порождаете из обработчика сигналов, не может сам реагировать на сигналы. Я хотел бы увидеть подробности, если этот точный код работает в PHP 5.2.9, потому что, насколько мне известно, это поведение было последовательным.

Так что вы можете сделать?

Во многих случаях лучшим вариантом является установка флага $ signal_recd внутри обработчика сигналов, который вы периодически опрашиваете в своем приложении.

Я являюсь автором довольно популярной библиотеки PHP Daemon, https://github.com/shaneharter/PHP-Daemon

На вашем месте я бы просто собрал ваше приложение и позволил бы ему беспокоиться об автоматическом перезапуске и т. Д. Но если ничего другого, вы, вероятно, можете взглянуть на его Core_Daemon :: auto_restart () и код обработки сигналов.

0 голосов
/ 16 марта 2012

Я подозреваю, что это ошибка в PHP. Я все еще пытаюсь подтвердить с абсолютной уверенностью, но в настоящее время у нас та же проблема.

Если вы запустите дочерний процесс и отправите сигнал, дочерний процесс получит и обработает сигнал. Если впоследствии вы повторно запустите другой дочерний процесс из родительского сценария и выполните другой сигнал, второй сигнал не будет получен дочерним процессом. Я пытался найти способ обойти эту проблему в PHP 5.3.10, но безрезультатно.

...