如何让grep通过tac管道返回值而不终止php exec()函数中的进程?

如何让grep通过tac管道返回值而不终止php exec()函数中的进程?,php,grep,shell-exec,Php,Grep,Shell Exec,我试图在nginx access.log中找到对“foo”的最新访问,当我通过命令行运行以下命令时,它完全按照预期工作,并且非常快 $output = exec('tac /var/log/nginx/access.log | grep -m1 "foo"'); echo $output; 但是,通过php的exec()函数运行它,它会在30秒后超时。如果我在服务器上终止tac进程,PHP将在终止进程后立即输出预期结果。我试过了 grep "foo" /var/log/nginx/access

我试图在nginx access.log中找到对“foo”的最新访问,当我通过命令行运行以下命令时,它完全按照预期工作,并且非常快

$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()
函数同样不起作用


感谢您提供的任何帮助。

您只需在PHP中使用标准文件读取函数和朋友即可:


<?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);