ロードされたファイルが数百MBなど特に大きい場合、それがGBに達するとパフォーマンスが低下します。では、PHPで大きなファイルを処理するための関数またはクラスはありますか? 答えは「はい」です。
PHP は本当に「オブジェクト指向」になってきており、元の基本的な SPL メソッドのいくつかが次々とクラスを実装し始めています。
PHP 5.1.0 以降、SPL ライブラリには 2 つの標準ファイル操作クラス、SplFileObject と SplFileInfo が追加されました。 SplFileInfo は PHP 5.1.2 以降で実装されています。
文字通りの意味から、SplFileObject は SplFileInfo よりも強力であることがわかります。
はい、SplFileInfo は、ファイル サイズ、ファイル アクセス時間、ファイル変更時間、サフィックス名、その他の値など、ファイルの一部の属性情報を取得するためにのみ使用され、SplFileObject は SplFileInfo のこれらの機能を継承します。
コードをコピー コードは次のとおりです:
/**行戻り文字列からファイルの内容を返します
*/
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', '> =')){
out out out - ‐ ‐ ‐ ‐ w- but($ i = 0; $ i< = $ count; ++ $ i){
next();//次の行
for ($i=1;$i<$startLine;++$i) {// 前の $startLine 行をスキップします
+$ i) {$ $ 競合 [] = fgets ($ fp); // ファイル行の内容を読み込みます}
fclose ($ fp);
Return array_filter ($ content);上に追加: !$fp->eof() または !feof($fp) この判断を追加すると効率に影響するため、自分で追加してください。多くの行の実行時間をテストするとわかります。ここに追加する必要はまったくありません。
上記の関数から、特にファイル行数が非常に多く、次のコンテンツをフェッチする必要がある場合、SplFileObject を使用する方が以下の fgets よりもはるかに高速であることがわかります。 fgets には 2 つのループが必要で、$endLine 回ループする必要があります。
この方法には多大な労力がかかり、最も効率的な方法を見つけるために多くの中国語の書き方をテストしました。改善すべき点があると思われる方がいらっしゃいましたら、ぜひお知らせください。
使用して、行 35270 ~ 35280 の内容を返します:
コードをコピーします
コードは次のとおりです:
echo '
';<br>var_dump(getFileLines('test.php',35270, 35280)); <br>エコー '
';
http://www.bkjia.com/PHPjc/751511.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/751511.html
技術記事ロードするファイルが数百Mなど特に大きく、Gサイズに達するとパフォーマンスが低下する場合、PHPで大きなファイルを処理するための関数またはクラスはありますか? 答えは「はい」です。 PHP は本当に...