Как сделать неблокирующий вызов php exec? - PullRequest
3 голосов
/ 26 мая 2019

Мне нужно выводить текст в именованный канал (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, прежде чем перейти к следующей инструкции. Это правда?

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