ホームページ  >  記事  >  バックエンド開発  >  PHP は大きなファイルの X 行から Y 行の内容を読み取ります

PHP は大きなファイルの X 行から Y 行の内容を読み取ります

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

PHP は大きなファイルの X 行から Y 行の内容を読み取ります

最近、ファイルの数行を読み取る必要がある小さなプログラムを書きましたが、ファイルが比較的大きいため、PHPで大きなファイルの数行を読み取る方法を研究し、メソッドを書きました。以下のように (注を追加):

function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
$content = array();
$count = $endLine - $startLine;
if(version_compare(PHP_VERSION, '5.1.0', '>=')){// 判断php版本(因为要用到SplFileObject,PHP>=5.1.0)
        $fp = new SplFileObject($filename, $method);
        $fp->seek($startLine-1);// 转到第N行, seek方法参数从0开始计数
                for($i = 0; $i <= $count; ++$i) {
                        $content[]=$fp->current();// current()获取当前行内容
                        $fp->next();// 下一行
 }
}else{//PHP<5.1
$fp = fopen($filename, $method);
if(!$fp) return &#39;error:can not read file&#39;;
for ($i=1;$i<$startLine;++$i) {// 跳过前$startLine行
fgets($fp);
}
for($i;$i<=$endLine;++$i){
$content[]=fgets($fp);// 读取文件行内容
}
fclose($fp);
}
return array_filter($content); // array_filter过滤:false,null,&#39;&#39;
}

追伸:

!$fp->eof() または !feof($fp) には「最後まで読む」の判定が追加されていません。また、この判定は実行効率に影響するため、テストを追加しました。時間が経てば分かるでしょうが、ここにそれを追加する必要はまったくありません。

上記の関数から、特にファイル行数が非常に多く、次のコンテンツをフェッチする必要がある場合には、SplFileObject を使用する方が以下の fgets よりもはるかに高速であることがわかります。 fgets には 2 つのループが必要で、$endLine 回ループする必要があります。

この方法には多大な労力がかかり、最も効率的な方法を見つけるために多くの中国語の書き方をテストしました。改善すべき点があると思われる方がいらっしゃいましたら、ぜひお知らせください。

使用すると、行 35270 ~ 35280 の内容を返します:

echo '<pre class="brush:php;toolbar:false">';var_dump(getFileLines('test.php',35270,35280));


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