2

これが私がbashで表現したいものです:

while true; do
  while read $line; do
    echo "Heard: $line"
  done < fifo
done

ここで、fifoは名前付きパイプへのパスです。これはFIFOから読み取られますが、FIFOが空の場合、何かが入るまでブロックされます。

PHPで同様のことを試みると、パイプに何もないときにfgetsが返されるため、ビジーループが発生します。

4

3 に答える 3

1

追加

sleep(1);

重いCPU使用を避けるために。これは、ビジー ループを回避する最も簡単な方法です。stream_select()を見ることもできます。これにより、スクリプトが読み取り可能な (または書き込み可能な) ストリームを待機する時間のタイムアウトを指定できます。または、 stream_set_blocking()を使用して、特定のストリームのfgets()のデフォルトの動作を変更することもできます。正確にはわかりませんが(自分で試したことはありません)、最後のものがあなたが探しているもののようです。

stream_set_blocking($stream, 1);
$r = fgets($stream);
于 2010-11-29T23:56:27.807 に答える
1

freadがブロックしていると思います。

于 2010-11-30T02:39:59.497 に答える
0

fopen() は、ブロッキングを取得する場所です。fgets() ではありません。私の問題は、ファイルを fopen() してからループを開始したことでした。そのため、パイプが一度書き込まれると、ビジーループが開始されました。代わりに、fopen() をループに入れると、ライターが存在するまでループがブロックされます。

于 2010-12-05T20:52:14.287 に答える