0

小さなログ ファイルから最大 8 ~ 10 MB のログ ファイルまで、ログ ファイルから読み込んでいます。典型的なサイズはおそらく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行を検索できますか?案件。

2 番目の質問があります。これは、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);
    }

}

私はおそらくこれを非常に複雑にしすぎていますか?

4

1 に答える 1

0

このようなツールの使用を強く検討しますgrep。PHP からこのコマンド ライン ツールを呼び出し、それを使用して、探している単語のファイルを検索し、一致する行のバイト オフセットを取得したり、一致する行と後続のコンテキスト行を取得したりできます。

ここにgrepマニュアルへのリンクがあります。 http://unixhelp.ed.ac.uk/CGI/man-cgi?grep

コマンドラインでコマンドを少し操作して、必要な方法で取得し、コンテンツをキャプチャ/表示する方法に応じて、、、または同様のものexec()を使用して PHP から呼び出します。passthru()

または、ファイルの最後にポインタを置いて、途中で移動するときに文字列fopen()を検索して、ファイル ポインタをファイル内で前方に移動することもできます。fseek()針を見つけたら、ファイルの終わりまたはログエントリの数に到達するまで、そのオフセットからファイルを読み取ることができます。

これらのいずれかは、ログ ファイル全体をメモリに読み込んでから操作するよりも望ましい場合があります。

考慮すべきもう 1 つのことは、1000 文字に意味があるかどうかです。通常、ログ ファイルには、長さが異なる行が含まれます。私には、次の Y 文字ではなく、ログ ファイルから次の X 行を取得することにもっと関心を持つべきだと思われます。行に 2000 文字ある場合、半分だけ取得したいということですか? まったく意味がないかもしれません。

于 2013-07-24T19:07:33.613 に答える