日志太大打不开,多行日志无法筛选等问题都会在本文中找到答案。
在 PHP 中处理大型日志文件时,由于文件的大小可能会消耗大量的内存,因此直接将整个文件加载到内存中解析通常是不可行的。
所以我们采用逐行读取的形式,以下为示例:
// 检查文件是否存在并且可读
if (!file_exists($file_path) || !is_readable($file_path)) {
error_log("文件 $file_path 不存在或不可读");
exit(1); // 使用适当的退出码表示失败
}
try{
$fp = fopen($path, 'r');
$max_line = 50;
$contact = [];
while (!feof($fp)) {
$i_str = stream_get_line($fp, 65535, "\n");
if ($i_str == '') {
break;
}
// 匹配日志开头_正则可被替换
if (preg_match('/\[.{10} .{8}\] \w+\.\w+\:/', $len_str)) {
// 通过 lineFunction 方法辨别日志是否被过滤
if ($len_str && lineFunction($len_str)) {
$line_num = count($len_str);
if ($line_num > $max_line) {
unset($len_str[$line_num - 1]);
}
array_unshift($len_Str);
}
$len_str = $i_str;
} else {
$len_str .= "\n" . $i_str;
}
}
fclose($fp);
echo expload("\n", $contact);
} catch (Excepion $e) {
// 捕获并处理异常,例如记录到错误日志
error_log("处理文件时发生异常: " . $e->getMessage());
// 根据情况考虑是否要关闭文件句柄
if (isset($fp) && is_resource($fp)) {
fclose($fp);
}
exit(1); // 使用适当的退出码表示失败
}