最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP讀取大文件的類SplFileObject使用介紹

 更新時間:2014年04月09日 09:55:44   作者:  
一般讀取文件我們用fopen 或者 file_get_contents ,前者可以循環(huán)讀取,后者可以一次性讀取,但都是將文件內(nèi)容一次性加載來操作。

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

復(fù)制代碼 代碼如下:
/** 返回文件從X行到Y(jié)行的內(nèi)容(支持php5、php4) 
 * @param string $filename 文件名
 * @param int $startLine 開始的行數(shù)
 * @param int $endLine 結(jié)束的行數(shù)
 * @return string
 */
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);// 轉(zhuǎn)到第N行, seek方法參數(shù)從0開始計數(shù)
        for($i = 0; $i <= $count; ++$i) {
            $content[]=$fp->current();// current()獲取當(dāng)前行內(nèi)容
            $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);// 讀取文件行內(nèi)容
        }
        fclose($fp);
    }
    return array_filter($content); // array_filter過濾:false,null,''
}
   
Ps: 上面都沒加”讀取到末尾的判斷”:!$fp->eof() 或者 !feof($fp),加上這個判斷影響效率,自己加上測試很多很多很多行的運(yùn)行時間就曉得了,而且這里加上也完全沒必要。
從上面的函數(shù)就可以看出來使用SplFileObject比下面的fgets要快多了,特別是文件行數(shù)非常多、并且要取后面的內(nèi)容的時候。fgets要兩個循環(huán)才可以,并且要循環(huán)$endLine次。
此方法花了不少功夫,測試了很多中寫法,就是想得出效率最高的方法。哪位覺得有值得改進(jìn)的歡迎賜教。
使用,返回35270行-35280行的內(nèi)容:
復(fù)制代碼 代碼如下:
echo '<pre>';
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>'; 

相關(guān)文章

最新評論

玛多县| 鹤山市| 铜陵市| 郴州市| 郸城县| 阳谷县| 同德县| 松江区| 芦山县| 香港| 宝兴县| 永昌县| 保康县| 莎车县| 安丘市| 宽城| 双城市| 红河县| 垦利县| 化德县| 昭觉县| 张家港市| 阳曲县| 南宁市| 临猗县| 湖口县| 福贡县| 成安县| 二连浩特市| 多伦县| 扬中市| 鲁山县| 荆州市| 红原县| 晋宁县| 高台县| 抚远县| 万荣县| 阿荣旗| 清涧县| 衡东县|