2011-01-27 5 views
2

私は約600 MBのテキストログファイルを持っています。php大きなテキストファイルのログを読み取る

私はphpを使ってそれを読んで、htmlページにデータを表示したいのですが、スクリプトを実行するたびに追加された最後の18行だけが必要です。

大きなファイルなので、私はそれをすべて読み込むことができず、私は期待したとおりに配列を反転します。彼らの別の方法ですか?

+3

外部コマンドを実行できますか? 'exec()'を使ってLinux/Unixの 'tail 'を呼び出すのが最も簡単な方法かもしれません。 –

+0

私はrootを持っていますが、理想的には自分のユーザーにも公開したいことがあります... UNIXの方法を使うのはセキュリティの問題でしょうか? – David19801

答えて

1

このサイズのファイルをメモリに読み込むことは、おそらく良い考えではありません。これはあなたの周りにあなたを取得する必要があります。

$file = escapeshellarg($file); 
$line = 'tail -n 18 '.$file; 
system($line); 
+0

実際にコマンドを実行するのを忘れました – ThiefMaster

+0

これを実行するにはどのような権限が必要ですか? – David19801

+0

通常の許可で十分です。多分あなたはファイルをchownする必要があります。 – Alfred

2

使用fopenfilesizefseekファイルを開き、ファイルのみの終わり近くにそれを読んで開始します。

fseekマニュアルページのコメントには、大きなファイルの最後のX行を読むための完全なコードが含まれています。

0

これを行うための最善の方法は、行ずつを読み取るために使用するの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); 
} 
+3

最後の18行に到達するために599MBのデータを読むことをお勧めします。 –

+0

〜600MBの*最後の18行を読んでみたいです。 :-) –

+0

うん、私は彼が最後に述べた行を誤読した、私は彼が最初の18を望んだと思った。 – RobertPitt

1

あなたがレコードの

$file = popen("tac $filename",'r'); 

while ($line = fgets($file)) { 
    echo $line; 
} 
0

との後方にそれをストリーミングすることができ、同じ問題を抱えていたし、ここにすべてのソリューションを試してみました。

Dagonのpopenの "tac $ filename"という方法が最も速く、メモリーとCPU負荷が最も低い方法が分かります。

毎回500行、1000行、2000行の2Gbログファイルでテストしました。スムース。ありがとうございました。

関連する問題