Php 将日志文件反向读取到数组中,这是在底部查找关键字时的最佳方法吗?

Php 将日志文件反向读取到数组中,这是在底部查找关键字时的最佳方法吗?,php,substr,stripos,array-reverse,Php,Substr,Stripos,Array Reverse,我从日志文件中读取数据,这些文件可以是任何内容,从一个小日志文件到8-10mb的日志。典型的大小可能是1mb。现在最关键的是,我要找的关键字通常在文档末尾,大概95%的情况下。然后我在关键字后提取1000个字符 如果我使用这种方法: $lines = explode("\n",$body); $reversed = array_reverse($lines); foreach($reversed AS $line) { // Search for my keyword } 它是否比使用以下方法

我从日志文件中读取数据,这些文件可以是任何内容,从一个小日志文件到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个字符,因此理论上,如果关键字后面有10000个字符,那么我就不必将它们读入内存,而第一个选项必须将所有内容读入内存,即使它可能只需要最后100行,我是否可以将它改为将100行读入内存,然后如果第一个100行没有成功,或者查询太轻以至于不重要,则再搜索101-200行

我有第二个问题,假设反向数组是最好的方法,在找到关键字后,我将如何提取接下来的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);
    }

}

<>我可能会过度复杂化这个问题?

< P>我会强烈地考虑使用这样的工具,比如<代码> GRP<代码>。您可以从PHP调用此命令行工具,并使用它在文件中搜索要查找的单词,并执行诸如提供匹配行的字节偏移量、提供匹配行加上尾部上下文行等操作

这里是到grep手册的链接

在命令行上稍微玩一下命令,以获得所需的方式,然后从PHP使用
exec()
passthru()
或类似方法调用它,具体取决于捕获/显示内容的方式

或者,您可以简单地
fopen()
将指针放在文件的末尾,然后使用
fseek()
在移动过程中搜索字符串,在文件中向前移动文件指针。一旦找到指针,就可以从该偏移量读取文件,直到到达文件末尾或日志条目数

这两种方法中的任何一种都比将整个日志文件读入内存,然后尝试使用它更好


另一个要考虑的是1000个字符是否有意义。通常,日志文件的行长度会有所不同。在我看来,您应该更关心从日志文件中获取下一个X行,而不是下一个Y字符。如果一行有2000个字符,你是说你只想得到其中的一半?这可能毫无意义。

您是否考虑过使用命令行工具,如
grep
来实现这一点?将这些文件加载到内存中似乎非常昂贵。无需反转阵列。。。只要用递减的索引做一个for循环,你们两个就可以扩展一点,我只有php经验,所以grep是我可以用我的php实现的东西吗?我基本上是从日志中提取所有信息,然后将其插入MYsql以供以后使用。我不明白你的意思,当你看到递减指数时,你能举个例子吗?