在php中阻止文件读取?

时间:2009-08-11 18:50:19

标签: php input io filehandle

我想从文本文件中读取所有内容并回显它。但是当我正在阅读时,可能会有更多的行写入文本文件,因此我不希望脚本在文件结束时退出,而是我不想等待更多行。这可能在php吗?

4 个答案:

答案 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进行比较。

无论如何,如果您希望脚本与浏览器(或客户端)同时发送,则应使用块(flushwhile(!feof()))发送输出,然后检查结束。如果有任何更改,请重新打开文件并从最新位置读取(您可以获得{{1}}循环之外的位置。