ホームページ  >  記事  >  バックエンド開発  >  PHP で大きなファイルを読み取るいくつかの方法

PHP で大きなファイルを読み取るいくつかの方法

墨辰丷
墨辰丷オリジナル
2018-05-31 10:14:471391ブラウズ

この記事では主に、PHP に基づいて大きなファイルを読み取るいくつかの方法を紹介します。主な方法は 3 つあります。興味のある友達は参考にしてみてください。

大きなファイルを読み込むのはいつも頭の痛い問題です。PHP を使用して小さなファイルを開発して読み込む場合は、さまざまな関数を直接使用してそれを実現できますが、大きな記事になると、一般的に使用される方法がわかります。正常に使用できない、または時間がかかりすぎます。PHP での大きなファイルの読み取りの問題の解決策を見てみましょう。この例がお役に立てば幸いです。

シナリオ: PHP は、1G ログ ファイルなどの非常に大きなファイルを読み取ります。ここでは 400M access.log ファイルを使用します

1. ファイルを使用して直接読み取ります

<?php
$starttime=microtime_float();
 
ini_set(&#39;memory_limit&#39;, &#39;-1&#39;);
$file = &#39;testfile.txt&#39;;
 
$data = file($file);
$line = $data[count($data) - 1000];
$endtime=microtime_float();
 
echo count($data),"<br/>";
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

実行結果: 10127784 行が使用されました。合計、7.8764359951秒

私のコンピューターには3Gのメモリが搭載されています。すべてのファイルをメモリにロードする必要があるため、この方法はお勧めできません

2. Linuxコマンドtailを使用します

<?php
 
$starttime=microtime_float();
 
$file = &#39;testfile.txt&#39;;
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 100 $file`;
 
echo $line,"<br/>";
 
$endtime=microtime_float();
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
 
//end

実行結果:のみ。簡単に実行するには数ミリ秒かかりました。この方法は Windows では使用できません

3. fseek 関数を使用します

この方法は、ファイルのすべての内容を読み込む必要はありません。内容は、PHPはCで書かれているので、ポインタの移動を通じてCでファイルを読み込むのと同じ実装なので、かなり効率が良いです。 fseek を使用してファイルを操作する場合、さまざまな方法があり、効率が若干異なる場合があります

以下は、一般的に使用されるいくつかの方法です


方法 1: fopen を使用してファイルを開きます (ファイル ポインター リソース ハンドルから)。


<?php
$starttime=microtime_float();
 
$file = &#39;testfile.txt&#39;;
$fp = fopen($file, "r+");
 
$line = 100;
$pos = -2;
$t =$data="";
 
while ($line > 0)
{
 while ($t != "\n") //换行符
 {
 fseek($fp, $pos, SEEK_END);//移动指针
 $t = fgetc($fp);//获取一个字符
 $pos--;//向前偏移
 }
 
 $t = "";
 $data = fgets($fp);//获取当前行的数据
 $line--;
}
fclose($fp);
echo $data,"<br/>";
$endtime=microtime_float();
 
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

実行結果: 0.338493108749

方法 2: 部分ごとに読み取ります

<?php
$starttime=microtime_float();
 
$file = &#39;testfile.txt&#39;;
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;//4K的块
$fs = sprintf("%u", filesize($file));
$readData=&#39;&#39;;
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : $fs;
 
for($len = 0; $len < $max; $len += $chunk){
 
 $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
 fseek($fp, ($len + $seekSize) * -1, SEEK_END);
 $readData = fread($fp, $seekSize) . $readData;
 
if (substr_count($readData, "\n") >= $num + 1) {
 
 $ns=substr_count($readData, "\n")-$num+2;
 preg_match(&#39;/(.*?\n){&#39;.$ns.&#39;}/&#39;,$readData,$match);
 $data = $match[1];
 break;
}
}
fclose($fp);
echo $data,"<br/>";
 
 
$endtime=microtime_float();
 
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

実行時間: 0.00199198722839


fgets 関数を使用して 1 行ずつ読み取ります

<?php
$file = fopen("testfile.txt","r");
 while(!feof($file))
 {
   echo fgets($file);
 }
 fclose($file);

spl ライブラリ関数

<?php
try{
  foreach( new SplFileObject(&#39;testfile.txt&#39;) as $line)
  echo $line.&#39;<br />&#39;;
}catch (Exception $e){
  echo $e->getMessage();
}

また、インターネット上にはファイルをブロックで読み取る方法がたくさんありますので、試してみましたが、改行文字「n」が含まれている必要があるようです。 。

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。


関連する推奨事項:

PHP の TP5 のリクエストリクエストオブジェクトメソッド

PHP の TP5 アップロードファイルメソッド

php 2 次元の連想配列を文字列に変換するメソッド

以上がPHP で大きなファイルを読み取るいくつかの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。