2017-04-19 23 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);