頂部導航開始 -->

PHP讀取大文件的X行到Y行的內容

一般讀取文件我們用fopen 或者 file_get_contents ,前者可以循環讀取,后者可以一次性讀取,但都是將文件內容一次性加載來操作。

如果加載的文件特別大時,如幾百M,上G時,這時性能就降下來了,那么PHP里有沒有對大文件的處理函數或者類呢? 答案是:有的。
PHP真的越來越“面向對象”了,一些原有的基礎的SPL方法都開始陸續地實現出class了。
從 PHP 5.1.0 開始,SPL 庫增加了 SplFileObject 與 SplFileInfo 兩個標準的文件操作類。SplFileInfo 是從 PHP 5.1.2 開始實現的。
從字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更為強大。
不錯,SplFileInfo 僅用于獲取文件的一些屬性信息,如文件大小、文件訪問時間、文件修改時間、后綴名等值,而 SplFileObject 是繼承 SplFileInfo 這些功能的。


//先創建一個有內容的文件

// $stream = fopen("a.txt", "w+");

// for($i =1; $i<10000000;$i++){

// $str = $i;

// if($i%5==0){

// $str = 'a'.$i;

// }

// file_put_contents("a.txt", $str."\r\n", FILE_APPEND);

// }

//再指定行數獲取文件內容

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 'error:can not read file';

for ($i=1;$i<$startLine;++$i) {// 跳過前$startLine行

fgets($fp);

}

for($i;$i<=$endLine;++$i){

$content[]=fgets($fp);// 讀取文件行內容

}

fclose($fp);

}

echo time();

return array_filter($content); // array_filter過濾:false,null,''

}

var_dump(getFileLines('a.txt',505370,505380));

運行結果如下:

自學php博客

詳細了解請查看:

http://blog.csdn.net/u013372487/article/details/51355174

http://php.net/manual/en/class.splfileobject.php

自學php博客
請先登陸后發表評論
  • 最新評論
  • 總共1條評論
自學php博客

哲涵1111自學php博客

2017-08-29 16:57:37 回復

  • ? 2014-2016 zixuephp.cn 版權所有
  • ICP證:皖ICP備16012107號
  • 聯系郵箱:[email protected]
  • 交流請加微信:weibobf2899 或掃下方二維碼
双大床红利扑克1手APP