使用 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 ×1