在PHP中阻止从文件读取

在PHP中阻止从文件读取,php,blocking,synchronous,Php,Blocking,Synchronous,下面是我想要在bash中表达的内容: while true; do while read $line; do echo "Heard: $line" done < fifo done 为true时;做 读$line时;做 回声“听到:$line” 完成

下面是我想要在bash中表达的内容:

while true; do
  while read $line; do
    echo "Heard: $line"
  done < fifo
done
为true时;做
读$line时;做
回声“听到:$line”
完成<先进先出
完成
这里,fifo是指向命名管道的路径。这将从fifo读取数据,但如果fifo为空,它将阻塞,直到其中有内容为止

在PHP中尝试类似的操作会导致一个繁忙的循环,因为fgets在管道中没有任何内容时返回。

Add

sleep(1);
避免大量cpu使用。这只是避免繁忙循环的最简单方法。您还可以查看,它允许指定脚本等待可读(或可写)流的超时时间。或者,您可以尝试使用更改特定流的默认行为。我不太清楚(我自己也没有试过),但似乎最后一个就是你要找的那个

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

我相信是阻塞;不在fgets()上。我的问题是,我先打开文件,然后开始循环,所以一旦管道被写入一次,繁忙的循环就会开始。相反,将fopen()放入循环会使其阻塞,直到有写入程序。

我看到stream\u set\u阻塞,但为了从文件创建流,它首先读取整个文件,然后将内容包装到流包装器中。这不能满足我的需要。您没有提供任何代码,但您提到了fifo管道,所以我认为您确实使用了。正如您在手册页面的示例中所看到的,它们可用于stream_select()