У меня есть программа, которая обычно работает до завершения, но в некоторых ситуациях она создает два дочерних процесса, после чего основной процесс завершается. Дочерние процессы будут продолжать работать после завершения основного процесса.
Я хочу вызвать эту программу на PHP.
Первоначально я использовал следующую стратегию (недопустимый php-код),
$process=proc_open("python xxx.py");
while (1) {
sleep(5);
$status = proc_get_status($process);
if (!$status['running']) {
exit_loop;
}
if (timeout) {
proc_terminate($process, 9);
exit_loop;
}
}
Но затем я вскоре обнаружил ошибку, заключающуюся в том, что процесс фактически немедленно завершился, поскольку $status['running'] имеет значение false, но дочерний процесс все еще выполняется. Как на самом деле дождаться всех дочерних процессов?
Второй вопрос: я не смотрел proc_terminate, но я также заметил, что proc_terminate может работать не так, как я ожидал. Это потому, что $process — это bash, а не настоящий процесс python? Это также может быть связано с тем, что я завершил только родительский основной процесс, но не дочерний процесс.
Кто-нибудь посоветует мне, является ли приведенный выше код надежным PHP-кодом или нет? Есть ли лучший способ справиться с этим?
Спасибо.
======================
Больше информации,
Я запускаю эту программу в оболочке (CLI) и не имею отношения к функциям CGI. Так что мне не нужно беспокоиться о max_execution_time.
Я хочу дождаться дочерних процессов, созданных основным процессом, открытым proc_open, я создам в программе только один процесс.
Программа Python, которую я хочу вызвать, может зависнуть на очень долгое время, поэтому я хочу проверить тайм-аут и завершить ее.