我想从文本文件中读取所有内容并回显它。但是当我正在阅读时,可能会有更多的行写入文本文件,因此我不希望脚本在文件结束时退出,而是我不想等待更多行。这可能在php吗?
答案 0 :(得分: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时间。
答案 1 :(得分:0)
事实上,当你“回应”它时,它会进入缓冲区。所以你想要的是“追加”新内容,如果它在浏览器仍在接收输出时添加的话。这是不可能的(但有一些方法)。
答案 2 :(得分: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,但不知道如何解决这个问题。
答案 3 :(得分:0)
您也可以使用filemtime
:您获得最新的修改时间戳,发送输出,最后再将存储的filemtime
与当前的fread
进行比较。
无论如何,如果您希望脚本与浏览器(或客户端)同时发送,则应使用块(flush
,while(!feof())
)发送输出,然后检查结束。如果有任何更改,请重新打开文件并从最新位置读取(您可以获得{{1}}循环之外的位置。