Мне нужно выводить текст в именованный канал (FIFO) в Linux. Несмотря на то, что я работаю в фоновом режиме с '&' и перенаправляю весь вывод в / dev / null, вызов shell_exec всегда блокируется.
В интернете есть множество ответов на этот вопрос, и все они в основном указывают на следующий раздел руководства по php:
Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выходные данные программы должны быть перенаправлены в файл или другой поток вывода. В противном случае PHP будет зависать, пока не закончится выполнение программы.
И, конечно же, когда я пытаюсь использовать неблокирующий подход (в качестве фона и перенаправления в / dev / null) с другими командами, такими как sleep, php успешно выполняется без зависаний. Но в случае обращения к FIFO, php зависает, хотя выполнение той же команды с bash не дает видимого вывода и немедленно возвращается в оболочку.
В bash я могу запустить:
bash$ { echo yay > fifo & } &> /dev/null
bash$ cat fifo
yay
[1]+ Done echo yay > fifo
но при запуске следующего php-файла с php echo.php
:
<?php
shell_exec("{ echo yay > fifo & } &> /dev/null");
?>
зависает, если я сначала не открою fifo для чтения.
Итак, мой вопрос: почему это блокирование, а сон - нет? Кроме того, я хочу знать, что происходит за кулисами: когда я помещаю '&' в вызове php, хотя вызов shell_exec
блокирует, вызов echo
явно не блокирует вызов php сеанса bash он включен, потому что когда я CTRL+C
вне php, я могу читать 'yay' из FIFO (если я не выполняю фоновую команду echo
, после CTRL+C
FIFO не содержит текста). Это говорит о том, что, возможно, php ожидает pid команды echo
, прежде чем перейти к следующей инструкции. Это правда?