PHP:如何不断读取文件

时间:2014-03-21 05:50:06

标签: php

我需要读取一直在变化的文件。只有文件,并且只会有一行一直在变化。

我发现以下代码应该按照我的要求执行:PHP: How to read a file live that is constantly being written to

但代码不起作用,页面只是不断加载,我试图像一个用户建议的那样添加“flush”,但我仍然无法使其工作。

这是代码

$file='/home/user/youfile.txt';
$lastpos = 0;
while (true) {
    usleep(300000); //0.3 s
    clearstatcache(false, $file);
    $len = filesize($file);
    if ($len < $lastpos) {
        //file deleted or reset
        $lastpos = $len;
    }
    elseif ($len > $lastpos) {
        $f = fopen($file, "rb");
        if ($f === false)
            die();
        fseek($f, $lastpos);
        while (!feof($f)) {
            $buffer = fread($f, 4096);
            echo $buffer;
            flush();
        }
        $lastpos = ftell($f);
        fclose($f);
    }
}

请有人看看,让我知道如何解决它。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果您的文件只有一个字符串,并且您需要在更改时阅读它,请使用以下代码:

$file = '/path/to/test.txt';
$last_modify_time = 0;
while (true) {
    sleep(1); // 1 s
    clearstatcache(true, $file);
    $curr_modify_time = filemtime($file);
    if ($last_modify_time < $curr_modify_time) {
        echo file_get_contents($file);
    }

    $last_modify_time = $curr_modify_time;
}

注意:

filemtime()以秒为单位返回上次文件修改时间,因此如果您需要每秒检查多次修改,可能需要找到其他解决方案。

此外,您可能需要添加set_time_limit(0);,具体取决于您的要求。

<强>更新

的index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"
            type="text/javascript">
    </script>
</head>
<body>
    <div id="file_content"></div>
    <script>
        var time = 0;
        setInterval(function() {
            $.ajax({
                type: "POST",
                data: {time : time},
                url: "fileupdate.php",
                success: function (data) {
                    var result = $.parseJSON(data)
                    if (result.content) {
                        $('#file_content').append('<br>' + result.content);
                    }
                    time = result.time;
                }
            });
        }, 1000);
    </script>
</body>

fileupdate.php

<?php
$file = 'test.txt';
$result = array();
clearstatcache(true, $file);

$data['time']    = filemtime($file);
$data['content'] = $_POST['time'] < $data['time']
    ? file_get_contents($file)
    : false;

echo json_encode($data);

答案 1 :(得分:0)

你可能会遇到3个缺点:

  • 首先,您已经拥有的代码是$lastpos。这意味着,它总是会在文件末尾查找添加的内容。你不清楚OP,但我认为这不是你想要的。我认为你唯一的一条线不断变化,但不一定要改变尺寸。因此,您可能希望删除该行$lastpos = ftell($f);
  • 其次,就相同而言,您需要检查文件大小以了解文件是否已更改。但正如我解释的那样,文件可能已经改变,而文件大小保持不变。尝试将文件大小的检查更改为检查文件的最后编辑日期。
  • 第三,也许最重要的是:在将php缓冲的输出释放到浏览器之前,你的web浏览器可能会缓冲你的输出,直到php脚本运行完毕。在PHP和Web服务器中禁用输出缓冲。像Web服务器的gzip /压缩之类的东西也可以强制输出缓冲效果。