我想使用php读取日志文件,但我只想返回文件的最后几行,这意味着最新的日志。我正在使用php和ajax为我的日志文件创建浏览器尾部。
所以我的方法将是:
H:i:s
没关系日志文件,我让它使用时间戳,现在问题是从底部开始读取文件以保持脚本高效,允许只读取最新的行而不是整个文件。
这个回答:https://stackoverflow.com/a/3686287/1328014将读取整个文件并返回与字符串匹配的所有行。这与我想要的类似,但我不想读取整个文件,因为我只想要最近的文件。
<?php
date_default_timezone_set('Asia/Manila');
$date = new DateTime();
$timeNow = '01:30:46';
function parse($str) {
preg_match("/(?P<time>\d{2}:\d{2}:\d{2}) (?P<status>\w*) (?P<message>[^:]*) : (?P<user>.*)/", $str, $re);
return $re;
}
$matches = array();
$handle = @fopen("logs/log(".date('m-d-Y').").txt", "r");
if ($handle)
{
while (!feof($handle))
{
$buffer = fgets($handle);
if(strpos($buffer, $timeNow) !== FALSE)
$matches[] = $buffer;
}
fclose($handle);
}
//show results:
print_r($matches);
这样可行,但是它正在读取整个文件,如果文件已经超过一个演出,那将会非常慢。
答案 0 :(得分:1)
使用linux&#34; tail&#34;命令从文件的底部读取。使用shell_exec PHP函数执行它并返回输出。
$last = shell_exec('tail -n 10 ' . "logs/log(".date('m-d-Y').").txt");
这将返回该文件中的最后10行,作为字符串。通过使用&#34; \ n&#34;爆炸该字符串来读取每一行。它们仍处于有序状态,因此以相反的顺序读取(最后一个到最后一个)记得在爆炸后从数组的末尾循环到开始。 将-n 10更改为您想要返回的最大行数。