Мониторинг детей с помощью PHP - PullRequest
9 голосов
/ 21 июля 2009

У меня проблема, я использую pcntl_fork для форка процесса в PHP,

$pid = pcntl_fork();
if ($pid == -1) {
 die('could not fork');
} else if ($pid) {
 // we are the parent
 pcntl_wait($status); //Protect against Zombie children
} else {
 pcntl_exec("/path/to/php/script");
 echo "Could not Execute...";
}

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

pcntl_signal(SIGUSR1, "signal_handler");

Спасибо и всего наилучшего,
Арун Шенкер Прасад.

1 Ответ

17 голосов
/ 21 июля 2009

Вы можете определенно контролировать дочерний процесс:

$pid = pcntl_fork();
if ($pid == -1) {
 die('could not fork');
} else if ($pid) {
 // we are the parent
 pcntl_waitpid($pid, $status, WUNTRACED); //Protect against Zombie children
 if (pcntl_wifexited($status)) {
   echo "Child exited normally";
 } else if (pcntl_wifstopped($status)) {
   echo "Signal: ", pcntl_wstopsig($status), " caused this child to stop.";
 } else if (pcntl_wifsignaled($status)) {
   echo "Signal: ",pcntl_wtermsig($status)," caused this child to exit with return code: ", pcntl_wexitstatus($status);
 }
} else {
 pcntl_exec("/path/to/php/script");
 echo "Could not Execute...";
}
  • pcntl_wifexited () - Проверяет, представляет ли код состояния нормальный выход
  • pcntl_wifstopped () - Проверяет, остановлен ли дочерний процесс в данный момент
  • pcntl_wifsignaled () - Проверяет, представляет ли код состояния завершение из-за сигнала
  • pcntl_wexitstatus () - возвращает код возврата прерванного потомка
  • pcntl_wtermsig () - возвращает сигнал, из-за которого дочерний процесс завершился
  • pcntl_wstopsig () - возвращает сигнал, который заставил ребенка остановиться

EDIT:

Уточнение относительно обмена сообщениями между родительским и дочерним процессами; Вы определенно не можете поймать исключения через процессы. Что касается обмена сообщениями, используя только библиотеку PCNTL, вы также ограничены обработкой сигналов и кодов выхода.

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

На основе файлов

Ваши дочерние процессы могут записывать сообщения в файл, который будет опрашиваться родителем.

на основе Memcache

То же, что и выше, но с использованием memcached в качестве средства связи.

База данных

То же, что и выше, но с использованием таблицы БД в качестве средства связи.

PHP-семафор / библиотека IPC

http://us3.php.net/manual/en/book.sem.php

Это позволяет вам использовать методы, такие как msg_send () и msg_receive (), для взаимодействия между процессами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...