我想从文本文件中读取所有内容并回显它。但是在我阅读时可能会有更多行写入文本文件,所以我不希望脚本在到达文件末尾时退出,而是我不希望它永远等待更多行。这在php中可能吗?
问问题
586 次
4 回答
1
这只是一个猜测,但尝试通过(passthru)“tail -f”输出。
但是您需要找到一种方法来刷新()您的缓冲区。
恕我直言,一个更好的解决方案是构建一个 ajax 站点。
将文件的内容读入一个数组。存储会话中的行数。打印文件的内容。
每 x 秒向检查文件的脚本启动一个 ajax 请求,如果行数大于会话数,则将结果附加到页面。
你可以使用 popen() inststed:
$f = popen("tail -f /where/ever/your/file/is 2>&1", 'r');
while(!feof($f)) {
$buffer = fgets($f);
echo "$buffer\n";
flush();
sleep(1);
}
pclose($f)
睡眠很重要,没有它你将拥有 100% 的 CPU 时间。
于 2009-08-11T18:58:37.780 回答
0
实际上,当您“回显”它时,它会进入缓冲区。因此,如果在浏览器仍在接收输出时添加了新内容,您想要的是“附加”新内容。这是不可能的(但有一些方法可以解决这个问题)。
于 2009-08-11T20:17:20.913 回答
0
我解决了。
诀窍是使用 fopen 并在达到 eof 时将光标移动到上一个位置并从那里继续阅读。
<?php
$handle = fopen('text.txt', 'r');
$lastpos = 0;
while(true){
if (!feof($handle)){
echo fread($handle,8192);
flush();
$lastpos = ftell($handle);
}else{
fseek($handle,$lastpos);
}
}
?>
还是很耗cpu,不知道怎么解决。
于 2009-08-11T20:44:47.580 回答
0
您也可以使用filemtime
:您获得最新的修改时间戳,发送输出,最后再次将存储filemtime
的与当前的进行比较。
无论如何,如果您希望脚本与浏览器(或客户端)同时运行,您应该使用块(fread
, flush
)发送输出,然后检查最后的任何更改。如果有任何更改,请重新打开文件并从最新位置读取(您可以获取循环之外的位置while(!feof())
)。
于 2009-08-12T21:38:39.820 回答