Следующие скрипты отслеживают /dev/shm/test
для новых файлов и выводит информацию об этом в режиме реального времени.proc_open оставляет зомби-процесс
Проблема заключается в том, что когда пользователь закрывает браузер, процесс inotifywait
остается открытым и так далее.
Есть ли способ избежать этого?
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "a") // stderr is a file to write to
);
$process = proc_open('inotifywait -mc -e create /dev/shm/test/', $descriptorspec, $pipes);
if (is_resource($process)) {
header("Content-type: text/html;charset=utf-8;");
ob_end_flush(); //ends the automatic ob started by PHP
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
fclose($pipes[1]);
fclose($pipes[0]);
fclose($pipes[2]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
?>
Ну ваш код содержит бесконечный цикл. Почему вы ожидаете, что он не сделает эту бесконечную петлю? Также: какой SAPI вы используете здесь? Что произойдет, например, если вы запустите этот скрипт в CLI и прервите его с помощью CTRL + C? Убит ли «детский процесс»? Открывает ли процесс proc_open дочерний процесс или независимый? И каков тайм-аут с 'fgets'? Я имею в виду, что вы делаете, если STDOUT не имеет никакого смысла читать - как долго это будет ждать? – hakre
@hakre Я могу подтвердить, что он убивает процесс inotifywait с помощью CTRL + C в режиме консоли.fgets не имеет тайм-аута, потому что я пытаюсь проверить 'connection_aborted()' и 'proc_terminate()' как ответ Джона, но не помог, что странно, поскольку документировано, что PHP будет знать, что соединение было прервано только после попытки вывода что-то (что я и делаю). Кроме того, не проверяя эти функции, скрипт должен прекратить отмену загрузки окна, не так ли? – JorgeeFG
Какую версию php вы используете? – Omiga