【发布时间】: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