ホームページ  >  記事  >  バックエンド開発  >  PHPで大きなファイルを読み取るためのクラスSplFileObjectの使用法の詳細な説明

PHPで大きなファイルを読み取るためのクラスSplFileObjectの使用法の詳細な説明

WBOY
WBOYオリジナル
2016-07-25 08:53:362250ブラウズ
  1. /**行戻り文字列からファイルの内容を返します
  2. */
  3. function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
  4. $content = array() ;
  5. $count = $endLine - $startLine;
  6. // PHP のバージョンを決定します (SplFileObject を使用するため、PHP>=5.1.0)
  7. if(version_compare(PHP_VERSION, '5.1.0', '>=') ){
  8. $fp = new SplFileObject($filename, $method);
  9. $fp->seek($startLine-1);//N 行目に進み、seek メソッドのパラメータは 0 から数え始めます
  10. for($i = 0; $i $content[]=$fp->current();// current() は現在の行の内容を取得します
  11. $fp->next( ) ;//次の行
  12. }
  13. }else{//PHP $fp = fopen($filename, $method);
  14. if(!$fp) return 'エラー: ファイルを読み取れません';
  15. for ( $ i=1;$i<$startLine;++$i) {// 前の $startLine 行をスキップします
  16. fgets($fp);
  17. }
  18. for($i;$i<=$endLine;++$ i ){
  19. $content[]=fgets($fp);// ファイル行の内容を読み取ります
  20. }
  21. fclose($fp);
  22. }
  23. return array_filter($content) // array_filter フィルター: false,null,' '
  24. }
  25. コードをコピー
手順: 上記には、!$fp->eof() または !feof($fp) の「最後まで読むかどうかの判断」は含まれていません。また、この判断は、多くの実行時間をテストすることでわかります。非常に多くの行があり、ここに追加する必要はまったくありません。 上記の関数から、特にファイル行数が非常に多く、次のコンテンツをフェッチする必要がある場合、SplFileObject を使用する方が以下の fgets よりもはるかに高速であることがわかります。 fgets には 2 つのループが必要で、$endLine 回ループする必要があります。 この方法には多大な労力がかかり、最も効率的な方法を見つけるために多くの中国語の書き方をテストしました。改善すべき点があると思われる方がいらっしゃいましたら、ぜひお知らせください。 使用して、行 35270 ~ 35280 の内容を返します。 コード:

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