小编row*_*194的帖子

如何从大 (4GB+) 打开的文件中读取新附加的行?

使用 PHP 7.3,我试图实现“tail -f”功能:打开一个文件,等待其他进程写入它,然后读取这些新行。

不幸的是, fgets() 似乎缓存了 EOF 条件。即使有新数据可用(文件时间更改), fgets() 也会返回一个空行。

重要的部分:我不能简单地关闭、重新打开、然后查找,因为文件大小有几十个演出,远高于 32 位限制。文件必须保持打开状态才能从正确的位置读取新数据。

我附上了一些代码来演示这个问题。如果将数据附加到输入文件,filemtime() 会检测到更改,但 fgets() 不会读取任何新内容。

fread()似乎确实有效,可以获取新数据,但我宁愿不必提出自己的“阅读一行”解决方案。

有谁知道我怎样才能让 fgets() 意识到它不是 EOF?

$fn = $argv[1];

$fp = fopen($fn, "r");
fseek($fp, -1000, SEEK_END);
$filemtime = 0;
while (1) {
  if (feof($fp)) {
    echo "got EOF\n";
    sleep(1);
    clearstatcache();
    $tmp = filemtime($fn);
    if ($tmp != $filemtime) {
      echo "time $filemtime -> $tmp\n";
      $filemtime = $tmp;
    }
  }
  $l = trim(fgets($fp, 8192));
  echo "l=$l\n";
}
Run Code Online (Sandbox Code Playgroud)

更新:我尝试排除对 feof 的调用(认为这可能是状态被缓存的地方)但行为没有改变;一旦 fgets …

php

5
推荐指数
1
解决办法
119
查看次数

标签 统计

php ×1