2017-05-29 10 views
0

ファイルから10行(たとえば2GB)を読み込む必要のあるログファイルビューアを開発しています。次にユーザーが次にクリックすると結果の10行を読み込む必要があります。 戻るボタンを押すと、最後の10行を印刷する必要があります。PHPで大きなファイルを読み込んで行ごとにナビゲートする

今のところ私はfgets(ファイルのサイズのため)を使ってファイルを読み込み、次の10行と前の10行を探す方法を見つけようとしています。

if($handle) 
{ 
    $cnt=1; 
    while(($buffer=fgets($handle))!==false and $cnt<=10) { 
     echo $buffer; 
     $cnt++; 
    } 
    if(feof($handle)) { 
     echo "error"; 
    } 

} 
+0

私はシェルの実行 'EXEC()'でこれを行うと、最後の10行を解析するために、 'tail'機能を使用します。 –

+0

フロントエンドには何を使用していますか?ウェブブラウザ? – Juned

+0

phpバックエンドでアクションを開始するyes.web browser-jquery – Jeyaganesh

答えて

0

PHPのSplFileObjectクラスは、あなたがしたいことを行います。参照: http://php.net/manual/en/splfileobject.seek.php

例コード:

<?php 
// Set $lineNumber to the line that you want to start at 
// Remember that the first line in the file is line 0 
$lineNumber = 43; 
// This sets how many lines you want to grab 
$lineCount = 10; 

// Open the file 
$file = new SplFileObject("logfile.log"); 

// This seeks to the line that you want to start at 
$file->seek($lineNumber); 

for($currentLine=0; $currentLine < $lineCount; $currentLine++) { 
    echo $file->current(); 
    $file->next(); 
} 
?> 
+0

大容量のファイル> 2GBの場合はこれが動作しますか?また、ユーザーが次のボタンをクリックすると.. $ファイルオブジェクトを再度作成する必要がありますか? – Jeyaganesh

+0

大きなファイルで正常に動作するはずです。あなたはウェブからこれを呼び出すので、毎回ログファイルを開いたままにして、あなたがクライアントアプリケーションである10行を提供するための何らかの種類のサーバープロセスを構築しない限り、たびに$ファイルを開く必要があります(おそらくAJAX呼び出しを介して)要求しています。つまり、目的のための簡単な実装(つまり、SplFileObjectを使用してファイルを開き、必要な10行を取得してから、それをユーザーに返す)にするだけです。 –

+0

私が取った別のアプローチ(私がサーバーアプライアンスプロジェクトで作業していたとき)は、ログファイルをデータベース(この場合はMySQL)にコミットするバックエンドプロセスを構築することでした。範囲、メッセージの特定のタイプ、ログラインの特定の数と範囲など –

関連する問題