PHP:如何实时读取不断写入的文件

2022-08-30 23:10:53

我想读取不断写入的日志文件。它与应用程序位于同一服务器上。问题是文件每隔几秒钟就会被写入一次,我基本上想要实时地将文件实时写入应用程序。tail

这可能吗?


答案 1

您需要循环睡眠:

$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

是的,您需要在循环中休眠一段时间,但不必重新打开文件。我只是在寻找类似的问题。我想读取自上次读取以来可能已更改的文件。

问题是资源已到达文件 () 的末尾。并且不继续阅读。解决方案是使用 重置指针。EOFfseek($fh, ftell($fh))

等待文本文件中输入的完整程序可能如下所示:

<?php

$fh = fopen('/var/log/system', 'r');
while (true) {
    $line = fgets($fh);
    if ($line !== false) {
      // show the line or send it via email or to a websocket..
    } else {
        // sleep for 0.1 seconds (or more?)
        usleep(0.1 * 1000000);
        fseek($fh, ftell($fh));
    }
}

推荐