これが私がbashで表現したいものです:
while true; do
while read $line; do
echo "Heard: $line"
done < fifo
done
ここで、fifoは名前付きパイプへのパスです。これはFIFOから読み取られますが、FIFOが空の場合、何かが入るまでブロックされます。
PHPで同様のことを試みると、パイプに何もないときにfgetsが返されるため、ビジーループが発生します。
これが私がbashで表現したいものです:
while true; do
while read $line; do
echo "Heard: $line"
done < fifo
done
ここで、fifoは名前付きパイプへのパスです。これはFIFOから読み取られますが、FIFOが空の場合、何かが入るまでブロックされます。
PHPで同様のことを試みると、パイプに何もないときにfgetsが返されるため、ビジーループが発生します。
追加
sleep(1);
重いCPU使用を避けるために。これは、ビジー ループを回避する最も簡単な方法です。stream_select()を見ることもできます。これにより、スクリプトが読み取り可能な (または書き込み可能な) ストリームを待機する時間のタイムアウトを指定できます。または、 stream_set_blocking()を使用して、特定のストリームのfgets()のデフォルトの動作を変更することもできます。正確にはわかりませんが(自分で試したことはありません)、最後のものがあなたが探しているもののようです。
stream_set_blocking($stream, 1);
$r = fgets($stream);
freadがブロックしていると思います。
fopen() は、ブロッキングを取得する場所です。fgets() ではありません。私の問題は、ファイルを fopen() してからループを開始したことでした。そのため、パイプが一度書き込まれると、ビジーループが開始されました。代わりに、fopen() をループに入れると、ライターが存在するまでループがブロックされます。