从底部读取并grepping文件,并使用php返回匹配的行



我想使用php读取日志文件,但我只想返回文件的最后一行,即最新的日志。我正在使用php和ajax为我的日志文件创建一个浏览器尾部。

所以我的方法是:

  1. 编写一个日志文件,该文件在行中添加时间戳H:i:s
  2. 允许php返回时间戳等于get请求的当前时间戳的行

不管日志文件是什么,我都让它处理时间戳,现在的问题是从底部开始读取文件,通过只读取最新的行而不是整个文件来保持脚本的效率。

这个答案: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);

这是可行的,但它正在读取整个文件,如果文件已经超过一个零工,那么速度会非常慢。

使用linux"tail"命令从文件底部读取。使用shell_exec PHP函数执行它并返回输出。

$last = shell_exec('tail -n 10 ' . "logs/log(".date('m-d-Y').").txt");

这将以字符串形式返回该文件的最后10行。通过用"\n"分解字符串来读取每一行。它们仍然按顺序排列,所以要按相反的顺序读取(倒数第十),请记住在分解数组后从数组的末尾循环到数组的开头。将-n 10更改为要返回的最大行数。

相关内容

  • 没有找到相关文章

最新更新