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

时间:2014-04-16 18:09:17

标签: php file file-io

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

所以我的方法将是:

  1. 编写一个日志文件,该文件附加带有时间戳H:i:s
  2. 的行
  3. 允许php返回时间戳等于get请求的当前时间戳的行。
  4. 没关系日志文件,我让它使用时间戳,现在问题是从底部开始读取文件以保持脚本高效,允许只读取最新的行而不是整个文件。

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

    这样可行,但是它正在读取整个文件,如果文件已经超过一个演出,那将会非常慢。

1 个答案:

答案 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更改为您想要返回的最大行数。