私は約600 MBのテキストログファイルを持っています。php大きなテキストファイルのログを読み取る
私はphpを使ってそれを読んで、htmlページにデータを表示したいのですが、スクリプトを実行するたびに追加された最後の18行だけが必要です。
大きなファイルなので、私はそれをすべて読み込むことができず、私は期待したとおりに配列を反転します。彼らの別の方法ですか?
私は約600 MBのテキストログファイルを持っています。php大きなテキストファイルのログを読み取る
私はphpを使ってそれを読んで、htmlページにデータを表示したいのですが、スクリプトを実行するたびに追加された最後の18行だけが必要です。
大きなファイルなので、私はそれをすべて読み込むことができず、私は期待したとおりに配列を反転します。彼らの別の方法ですか?
このサイズのファイルをメモリに読み込むことは、おそらく良い考えではありません。これはあなたの周りにあなたを取得する必要があります。
$file = escapeshellarg($file);
$line = 'tail -n 18 '.$file;
system($line);
実際にコマンドを実行するのを忘れました – ThiefMaster
これを実行するにはどのような権限が必要ですか? – David19801
通常の許可で十分です。多分あなたはファイルをchownする必要があります。 – Alfred
使用fopen
、filesize
とfseek
ファイルを開き、ファイルのみの終わり近くにそれを読んで開始します。
fseek
マニュアルページのコメントには、大きなファイルの最後のX行を読むための完全なコードが含まれています。
これを行うための最善の方法は、行ずつを読み取るために使用するのfreadとfgetsので、これはまさにこだわり速いだけで1行を一度に読み込むとされていないされている間のファイル:使用状況の
例は次のようになります。
$handle = fopen("/logs/log.txt", "r")
if ($handle)
{
fseek($handle,-18,SEEK_END); //Seek to the end minus 18 lines
while (!feof($handle))
{
echo fgets($handle, 4096); //Make sure your line is less that 4096, otherwise update
$line++;
}
fclose($handle);
}
最後の18行に到達するために599MBのデータを読むことをお勧めします。 –
〜600MBの*最後の18行を読んでみたいです。 :-) –
うん、私は彼が最後に述べた行を誤読した、私は彼が最初の18を望んだと思った。 – RobertPitt
あなたがレコードの
$file = popen("tac $filename",'r');
while ($line = fgets($file)) {
echo $line;
}
との後方にそれをストリーミングすることができ、同じ問題を抱えていたし、ここにすべてのソリューションを試してみました。
Dagonのpopenの "tac $ filename"という方法が最も速く、メモリーとCPU負荷が最も低い方法が分かります。
毎回500行、1000行、2000行の2Gbログファイルでテストしました。スムース。ありがとうございました。
外部コマンドを実行できますか? 'exec()'を使ってLinux/Unixの 'tail 'を呼び出すのが最も簡単な方法かもしれません。 –
私はrootを持っていますが、理想的には自分のユーザーにも公開したいことがあります... UNIXの方法を使うのはセキュリティの問題でしょうか? – David19801