我如何在不杀死PHP exec()函数中杀死该过程的情况下返回值的GREP返回值



我试图在nginx access.log中找到'foo'的最新访问,当我通过命令行运行以下命令时,它的工作原理与预期且非常快。<<<</p>

$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中使用标准文件读取功能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);

最新更新