2017-04-19 34 views
0

我想在nginx access.log中找到'foo'的最近访问权限,当我通过命令行运行以下命令时,它的工作方式与预期的一样,并且非常快速。我怎样才能得到grep管道通过tac返回值而不杀死php exec()函数中的进程?

$output = exec('tac /var/log/nginx/access.log | grep -m1 "foo"'); 
echo $output; 

然而,运行它通过PHP的exec()功能,其30次后,一些秒。如果我杀掉了服务器上的tac进程,那么只要进程被终止,PHP就会输出预期的结果。我曾尝试

grep "foo" /var/log/nginx/access.log | tail -1 

但那要花费整整22秒内找到结果,而不是在命令行中第二个的一小部分,但同样不会通过PHP exec()功能工作。

感谢您提供任何帮助。

+0

是否有任何问题的答案提供了有益的?你应该**提高** _所有答案是有帮助的,**标记接受**最好回答你的问题的答案。这会将问题标记为“封闭”,并在网站上给您一些声誉。请参阅https://stackoverflow.com/help/someone-answers – miken32

回答

0

你可能只是这样做PHP中的标准文件阅读功能fopen(),朋友们:

<?php 
$fname = "/var/log/nginx/access.log"; 
$pos = 0; 
$matches = []; 
$search = "foo"; 
$limit = 3; 
$line = ""; 

$f = fopen($fname, "r"); 
while (fseek($f, $pos, SEEK_END) !== -1) { 
    $char = fgetc($f); 
    if ($char === PHP_EOL) { 
     if (strpos($line, $search) !== false) { 
      $matches[] = $line; 
      if (count($matches) === $limit) { 
       break; 
      } 
     } 
     $line = ''; 
    } else { 
      $line = "$char$line"; 
    } 
    $pos--; 
} 
fclose($f); 
print_r($matches);