我不知道怎么说这个,所以我会打出来然后编辑并回答任何问题.
目前在我的本地网络设备(基于PHP4)上我使用它来定制一个实时系统日志文件:http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/
这很好用,并且每1秒加载一个执行a的外部页面(logfile.php)tail -n 100 logfile.log .脚本不进行任何缓冲,因此它在屏幕上显示的结果是日志文件中的最后100行.
logfile.php包含:
<? // logtail.php $cmd = "tail -10 /path/to/your/logs/some.log"; exec("$cmd 2>&1", $output);
foreach($output as $outputline) {
echo ("$outputline\n");
}
?>
Run Code Online (Sandbox Code Playgroud)
这部分运作良好.
我已经调整了logfile.php页面,将$ outputline写入一个新的文本文件,只需使用 fwrite($fp,$outputline."\n");
虽然这有效但我在创建的新文件中存在重复问题.
显然每次运行tail -n 100都会产生结果,下次运行它会产生一些相同的行,因为重复这一点我最终会在新的文本文件中出现多行重复.
我不能直接比较我要写入前一行的行,因为可能有相同的匹配.
有没有什么方法可以比较当前100行的块与前一个块,然后只写不匹配的行..再次可能的问题,块A和B将包含所需的相同行...
是否可以更新logfile.php以记录它在我的日志文件中最后占用的位置,然后只读取那里的下一行并将其写入新文件?
日志文件可能高达500MB,所以我不想每次都读取它.
任何建议或建议欢迎..
谢谢
更新@ 16:30
我有点使用这个:
$file = "/logs/syst.log";
$handle = fopen($file, "r");
if(isset($_SESSION['ftell'])) {
clearstatcache();
fseek($handle, $_SESSION['ftell']);
while ($buffer = fgets($handle)) {
echo $buffer."<br/>";
@ob_flush(); @flush();
}
fclose($handle);
@$_SESSION['ftell'] = ftell($handle);
} else {
fseek($handle, -1024, SEEK_END); …Run Code Online (Sandbox Code Playgroud)