PHP では、ファイルを読み取るときに最も速い方法は、file や file_get_contents などの関数を使用することで、数行の簡単なコードで必要な関数を美しく完成させることができます。ただし、操作するファイルが比較的大きなファイルの場合、これらの機能では不十分な場合があります。ここでは、大きなファイルを読み込むときによく使用される操作方法について説明します。
要件
約500万行を含む8億のログファイルがあります。phpを使用して最後の数行の内容を返します。
実装方法
1. ファイル関数を直接使用して操作します
注: ファイル関数はすべての内容を一度にメモリに読み取るため、PHP は一部の不適切に作成されたプログラムがメモリを過剰に消費することを防ぎます。システム メモリが不足し、サーバーがクラッシュするため、デフォルトでは最大メモリ使用量が 16M に制限されます。これは、php.ini のmemory_limit = 16M によって設定されます。この値が -1 に設定されている場合、メモリ使用量は制限されません。
以下は、このファイルの最後の行を抽出するために file を使用するコードです。
コード全体の実行には 116.9613 (秒)かかります。
コードは次のとおりです。 $fp = fopen ($file, "r"); $chunk = 4096;
$fs = ("%u", filesize($file)); ($fs) = = PHP_INT_MAX) ? PHP_INT_MAX : ファイルサイズ($file);
for ($len $seekSize = ($max - $len > $chunk) : $max - $len;
$readData = fread($fp, $seekSize); ;
if (substr_count($readData, "n") >= $num + 1) {
preg_match("!(.*?n){".($num)."}$!", $readData , $match);
$data = $match[0];
}
}
echo $data;
F5 を押すと、このような大きなファイルをメモリに直接読み取ると、重大な結果が生じることがわかります。そのため、memory_limit をあまり高く調整することはできません。それ以外の場合、唯一の選択肢は、コンピューターをリセットすることです
2. Linux tail コマンドを直接呼び出して、最後の数行を表示します
Linux コマンドラインでは、tail -n を直接使用できます。 10 access.log を使用すると、ログ ファイルの最後の数行を簡単に表示できます。PHP を直接使用して tail コマンドを呼び出し、次のように PHP コードを実行できます。
コード全体の実行には 0.0034 (秒) かかります。コード
コードは次のとおりです:
file = 'access.log'; $file =escapeshellarg($file) // コマンドラインパラメータを安全にエスケープします
$line = `tail -n 1 $file` ;
echo $line;
3. php の fseek を使用してファイルを直接検索する方法
この方法は、ファイルの内容をすべて読み込む必要はありませんが、動作します。 fseek を使用してファイルを操作する場合、効率が若干異なる場合があります。次に、一般的に使用される 2 つの方法を示します。 fseek を通じてファイルの最後の EOF を検索し、その後、この行のデータを取得し、次に次の行の開始位置を検索し、次にこの行の位置を取得します。 $num 行が見つかるまで。
実装コードは次のとおりです
コード全体の実行には 0.0095 (s) かかります
コードをコピーします
コードは次のとおりです:
function tail($fp,$n,$base=5) {
assert($n>0);
$pos = $n+1;
while(count($lines)fseek($fp) ,-$pos,SEEK_END );
} catch (例外 $e){ fseek(0);
$pos *= $base; $lines,fgets($ fp));
}
}
return array_slice($lines,0,$n) } var_dump(fopen("access.log","r+"),10); ;
方法 2
ファイルの末尾から読み取るには fseek を使用しますが、今回は少しずつ読み取るのではなく、データを 1 つずつ読み取るたびに、読み取りデータを読み取ります。は buf. に配置され、改行文字の数 (n) を使用して、最後の $num 行のデータが読み込まれたかどうかを判断します。
実装コードは次のとおりです
コード全体の実行には 0.0009(s) かかります。
コードをコピーします
コードは次のとおりです:
$fp = fopen($file, "r");
$pos = -2; ;
$data = "";
while ($line > 0) {
fseek($fp, $pos, SEEK_END); );
$pos --;
$t = " ";
$line --;
fclose ($fp);
方法 3 コード全体の実行には 0.0003(s) かかります
コードをコピーします コードは次のとおりです:
ini_set('memory_limit','-1');
$file = 'アクセス.ログ ';
$data = ファイル($file);
$line = $data[count($data)-1];
http://www.bkjia.com/PHPjc/326534.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/326534.html技術記事 php でファイルを読み取るとき、最も速い方法は file や file_get_contents などの関数を使用することです。数行の簡単なコードでタスクを美しく完了できます。