ユーザーが指定した文字列を取得し、リモートサーバーに SSH で送信し、ファイルを配列に読み取り、文字列を含む要求/応答ブロックを解析してユーザーに返す PHP スクリプトがあります。
PHP はファイル全体を配列に格納しようとしてメモリ不足になるため、この実装は大きなログ ファイルでは機能しません。
サンプルデータ:
*** REQUEST
request line 1
request line 2
request line 3
[...]
*** RESPONSE
response line 2
response line 2
response line 3
[...]
[blank line]
リクエストとレスポンスの長さはさまざまなので、何行になるかはわかりません。
ファイル全体をメモリに保存せずにファイルをチャンク単位で読み取るにはどうすればよいでしょうか?ログからデータの完全な要求/応答ブロックを切り捨てずに常に処理できるようにするにはどうすればよいでしょうか?
私の経験は通常、ファイル全体または配列全体で作業しているため、これについては非常に密集しているように感じます。
これが私の現在のコードです ($search は、ログで探しているユーザー指定の文字列を表しています)。これは、最初にファイル全体を配列に入れています。
$stream = ssh2_exec($ssh, $command);
stream_set_blocking($stream, true);
$data = '';
while($buffer = fread($stream, 4096)) {
$data .= $buffer;
}
fclose($stream);
$rawlog = $data;
$logline = explode("\n",$rawlog);
reset($logline);
$block='';
foreach ( $logline as $k => $v ) {
if ( preg_match("/\*\*\* REQUEST",$v) && $block != '') {
if ( preg_match("/$search/i",$block) ) {
$results[] = $block;
}
$block=$v . "\n";
} else {
$block .= $v . "\n";
}
}
if ( preg_match("/$search/i",$block) ) {
$results[] = $block;
}
助言がありますか?