这是我想要用bash表达的内容:
while true; do
while read $line; do
echo "Heard: $line"
done < fifo
done
这里,fifo是命名管道的路径。这将从fifo中读取,但如果fifo为空,它将阻塞直到其中有内容。
在PHP中尝试类似的事情导致忙循环,因为当管道中没有任何内容时fgets返回。
答案 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()放在循环中会使其阻塞,直到有一个编写器。