我正在读取日志文件,这些文件可以是从小日志文件到 8-10mb 日志的任何内容。典型的大小可能是 1mb。现在的关键是,我要查找的关键字通常位于文档末尾附近,在大约 95% 的情况下。然后我在关键字之后提取 1000 个字符。
如果我使用这种方法:
$lines = explode("\n",$body);
$reversed = array_reverse($lines);
foreach($reversed AS $line) {
// Search for my keyword
}
它会比使用更有效:
$pos = stripos($body,$keyword);
$snippet_pre = substr($body, $pos, 1000);
我不确定的是stripos是否只是一次开始搜索文档1个字符,所以理论上如果关键字后面有10,000个字符,那么我不必将它们读入内存,而第一个选项必须将所有内容读入内存,即使它可能只需要最后 100 行,我是否可以将其更改为将 100 行读入内存,然后如果前 100 行不成功,或者查询太轻以至于它不是真的那么搜索另外 101-200 行事情。
我有第二个问题,假设 reverse_array 是最好的方法,我如何在找到关键字后提取接下来的 1000 个字符,这是我的悲惨尝试
$body = $this_is_the_log_content;
$lines = explode("\n",$body);
$reversed = array_reverse($lines);
foreach($reversed AS $line) {
$pos = stripos($line,$keyword);
$snippet_pre = substr($line, $pos, 1000);
}
Why i don't think that will work is because each $line might only be a few hundred characters so would the better solution be to explode it every say 2,000 lines and also keep the previous $line as a backup variable so something like this.
$body = $this_is_the_log_content;
$lines = str_split($body, 2000);
$reversed = array_reverse($lines);
$previous_line = $line;
foreach($reversed AS $line) {
$pos = stripos($line,$keyword);
if ($pos) {
$line = $previous_line . ' ' . $line;
$pos1 = stripos($line,$keyword);
$snippet_pre = substr($line, $pos, 1000);
}
}
我可能大大过度复杂化了这个?