我正在尝试在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()
函数工作。
感谢您提供任何帮助。
答案 0 :(得分:0)
您可以使用标准文件读取函数fopen()
和朋友在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);