【问题标题】:Reading a log file into an array reversed, is it best method when looking for keyword near the bottom?将日志文件读入反向数组,在底部附近寻找关键字时最好的方法是什么?
【发布时间】:2013-07-24 17:49:12
【问题描述】:

我正在读取日志文件,这些文件可以是从小日志文件到 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);
    }

}

我可能过于复杂了?

【问题讨论】:

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

标签: php substr stripos array-reverse


【解决方案1】:

我强烈考虑为此使用grep 之类的工具。您可以从 PHP 调用此命令行工具并使用它在文件中搜索您要查找的单词,并执行诸如为您提供匹配行的字节偏移量、为您提供匹配行加上尾随上下文行等操作。

这里是 grep 手册的链接。 http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

在命令行上稍微玩一下命令,以按照您想要的方式获取它,然后根据您需要捕获/显示内容的方式,使用exec()passthru() 或类似方法从 PHP 调用它。

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

其中任何一个都可能比将整个日志文件读入内存然后尝试使用它更可取。

要考虑的另一件事是 1000 个字符是否有意义。通常日志文件会有长度不同的行。对我来说,您似乎应该更关心从日志文件中获取接下来的 X 行,而不是接下来的 Y 个字符。如果一行有 2000 个字符,你是说你只想得到一半吗?这可能根本没有意义。

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多