ホームページ  >  記事  >  バックエンド開発  >  大きなファイルの指定された行をすばやく読み取る PHP メソッド

大きなファイルの指定された行をすばやく読み取る PHP メソッド

WBOY
WBOYオリジナル
2016-06-20 13:02:302001ブラウズ

1. 直面している問題の分析

通常の小さなファイルを読み取るには、通常、fopen または file_get_contents を使用します。これは非常に便利で簡単です。前者はループで読み取ることができ、後者は一度に読み取ることができますが、どちらもファイルの内容をロードします。一度。ロードされるファイルが数百メガバイトやギガバイトなど、特に大きい場合、パフォーマンスの低下が非常に顕著になります。PHP には大きなファイルを処理するための関数やクラスはありますか。 答えは「はい」です。

2. SplFileObject クラスは、大きなファイルの読み取りの問題を効果的に解決します

PHP 5.1.0 以降、SPL ライブラリには 2 つの標準ファイル操作クラス、SplFileObject と SplFileInfo が追加されました。

文字通りの意味から、SplFileObject は SplFileInfo よりも強力であることがわかります。

はい、SplFileInfo はファイル サイズ、ファイル アクセス時間、ファイル変更時間、サフィックス名などのファイルの一部の属性情報を取得するためにのみ使用されますが、SplFileObject は SplFileInfo のこれらの機能を継承し、多くのファイル処理クラスを追加します。操作メソッド。

/**ファイルの内容を X 行目から Y 行目まで返します (php5、php4 をサポート)
* @param string $filename ファイル名
* @param int $startLine 開始行番号
* @param int $endLine 終了行番号
* @戻り文字列
*/
function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
$content = array();
$count = $endLine - $startLine;
// PHPのバージョンを確認する(SplFileObjectを使用しているため、PHP>=5.1.0)
if(version_compare(PHP_VERSION, '5.1.0', '>=')){
$fp = new SplFileObject($filename, $method);
$fp->seek($startLine-1);// N 行目に進み、seek メソッドのパラメータは 0 から数え始めます
for($i = 0; $i $content[]=$fp->current();// current() は現在の行の内容を取得します
$fp->next();// 次の行
}
}else{//PHP $fp = fopen($filename, $method);
if(!$fp) return 'エラー: ファイルを読み取れません';
for ($i=1;$i fgets($fp);
}
for($i;$i $content[]=fgets($fp);//ファイル行の内容を読み取ります
}
fclose($fp);
}
return array_filter($content); // array_filter フィルター: false,null,''
}

追伸:
(1) 上記では、!$fp->eof() または !feof($fp) という「最後まで読む判定」が追加されていません。実際には、この判定を追加することは効率に影響を与えません。全く必要な効果。
(2) 上記の関数と実際の操作から、特にファイルの行数が非常に多く、次の内容を取得する必要がある場合、SplFileObject クラスを使用する方が、以下の fgets 関数よりもはるかに効率的であることがわかります。 fgets には 2 つのループが必要です。


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