这是我想用 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()ed 文件然后开始了我的循环,所以一旦管道被写入一次,繁忙的循环就会开始。相反,将 fopen() 放入循环中会使其阻塞,直到有写入器。