在PHP中阻止从文件读取

时间:2010-11-29 23:46:50

标签: php blocking synchronous

这是我想要用bash表达的内容:

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

这里,fifo是命名管道的路径。这将从fifo中读取,但如果fifo为空,它将阻塞直到其中有内容。

在PHP中尝试类似的事情导致忙循环,因为当管道中没有任何内容时fgets返回。

3 个答案:

答案 0 :(得分:1)

添加

sleep(1);

避免繁重的CPU使用率。这只是避免繁忙循环的最简单方法。您还可以查看stream_select(),它允许指定脚本等待可读(或可写)流的超时时间。或者,您可以尝试使用fgets()更改特定流的stream_set_blocking()的默认行为。我完全不知道(我自己没试过),但似乎最后一个是你正在寻找的那个。

stream_set_blocking($stream, 1);
$r = fgets($stream);

答案 1 :(得分:1)

我相信fread正在阻止。

答案 2 :(得分:0)

fopen() is where you get blocking;不在fgets()上。我的问题是我fopen()ed文件然后开始我的循环,所以一旦管道被写入一次,繁忙的循环将开始。相反,将fopen()放在循环中会使其阻塞,直到有一个编写器。