Как написать в именованный канал Linux из PHP?

У меня есть следующий скрипт bash:

server_control_pipe="/var/custom_pipe_file_name"init_script="/usr/sbin/service [somedaemon]"
mkfifo -m 666 "$server_control_pipe"
while read line <"$server_control_pipe"do
echo "Received $line"if [[ "$line" == 'stop' ]]; then
$init_script stop
elif [[ "$line" == 'start' ]]; then
$init_script start
elif [[ "$line" == 'stoppipe' ]]; then
break
fi
echo "Waiting..."done

echo "END"

…и следующий скрипт PHP:

<?php
define('SERVER_CONTROL_PIPE', "/var/custom_pipe_file_name");

if(false === file_put_contents(SERVER_CONTROL_PIPE, "start\n", FILE_APPEND))
throw new Exception("Could not write to server control pipe");

При запуске сценария PHP цикл в сценарии bash, кажется, завершается, а сценарий bash просто выводит END.

Чтобы попытаться выяснить, почему это происходит, я заменил свой PHP-скрипт следующим кодом:

<?php
define('SERVER_CONTROL_PIPE', "/var/custom_pipe_file_name");

$f = fopen(SERVER_CONTROL_PIPE, 'w');
if(false === $f)
throw new Exception("Could not open server control pipe");

$ret = fwrite($f, 'start\n');
if(false === $ret)
throw new Exception("Could not write to server control pipe");

fclose($f);

Я обнаружил, что цикл сценария bash завершается всякий раз, когда fopen называется.

Поэтому мой вопрос сводится к следующему: как мне открыть канал в PHP, чтобы не прерывать цикл сценария bash?

0

Решение

Если вы хотите, чтобы скрипт выполнялся все время, вы должны иметь значение true, а не read read, например:

while :
do
echo "Press [CTRL+C] to stop.."sleep 1
done

Если вы прочитаете строку, вы прочитаете содержимое файла в этом состоянии и закончите выполнение.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]