欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

如果加載的文件特別大時(shí),如幾百M(fèi),上G時(shí),這時(shí)性能就降下來(lái)了,那么PHP里有沒有對(duì)大文件的處理函數(shù)或者類呢? 答案是:有的。
PHP真的越來(lái)越“面向?qū)ο蟆绷?,一些原有的基礎(chǔ)的SPL方法都開始陸續(xù)地實(shí)現(xiàn)出class了。
從 PHP 5.1.0 開始,SPL 庫(kù)增加了 SplFileObject 與 SplFileInfo 兩個(gè)標(biāo)準(zhǔn)的文件操作類。SplFileInfo 是從 PHP 5.1.2 開始實(shí)現(xiàn)的。
從字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更為強(qiáng)大。
不錯(cuò),SplFileInfo 僅用于獲取文件的一些屬性信息,如文件大小、文件訪問時(shí)間、文件修改時(shí)間、后綴名等值,而 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版本(因?yàn)橐玫絊plFileObject,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開始計(jì)數(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) {// 跳過(guò)前$startLine行
            fgets($fp);
        }
        for($i;$i<=$endLine;++$i){
            $content[]=fgets($fp);// 讀取文件行內(nèi)容
        }
        fclose($fp);
    }
    return array_filter($content); // array_filter過(guò)濾:false,null,''
}
   
Ps: 上面都沒加”讀取到末尾的判斷”:!$fp->eof() 或者 !feof($fp),加上這個(gè)判斷影響效率,自己加上測(cè)試很多很多很多行的運(yùn)行時(shí)間就曉得了,而且這里加上也完全沒必要。
從上面的函數(shù)就可以看出來(lái)使用SplFileObject比下面的fgets要快多了,特別是文件行數(shù)非常多、并且要取后面的內(nèi)容的時(shí)候。fgets要兩個(gè)循環(huán)才可以,并且要循環(huán)$endLine次。
此方法花了不少功夫,測(cè)試了很多中寫法,就是想得出效率最高的方法。哪位覺得有值得改進(jìn)的歡迎賜教。
使用,返回35270行-35280行的內(nèi)容:
復(fù)制代碼 代碼如下:
echo '<pre>';
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>'; 

相關(guān)文章

  • laravel Task Scheduling(任務(wù)調(diào)度)在windows下的使用詳解

    laravel Task Scheduling(任務(wù)調(diào)度)在windows下的使用詳解

    今天小編就為大家分享一篇laravel Task Scheduling(任務(wù)調(diào)度)在windows下的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Laravel中的chunk組塊結(jié)果集處理與注意問題

    Laravel中的chunk組塊結(jié)果集處理與注意問題

    這篇文章主要給大家介紹了關(guān)于Laravel中chunk組塊結(jié)果集處理與使用中要注意問題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • laravel框架關(guān)于搜索功能的實(shí)現(xiàn)

    laravel框架關(guān)于搜索功能的實(shí)現(xiàn)

    本文是作者整理的關(guān)于laravel框架搜索功能的實(shí)現(xiàn)原理,并附上了詳細(xì)代碼,有需要的小伙伴請(qǐng)持續(xù)關(guān)注!
    2018-03-03
  • 深入理解PHP中的count函數(shù)

    深入理解PHP中的count函數(shù)

    下面小編就為大家?guī)?lái)一篇深入理解PHP中的count函數(shù)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • Laravel框架隊(duì)列原理與用法分析

    Laravel框架隊(duì)列原理與用法分析

    這篇文章主要介紹了Laravel框架隊(duì)列原理與用法,結(jié)合實(shí)例形式分析了Laravel框架隊(duì)列的原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-09-09
  • 如何使用PHP給圖片加水印

    如何使用PHP給圖片加水印

    這篇文章主要介紹了使用PHP給圖片加水印,感興趣的碼農(nóng)可以參考一下本文章的源代碼。
    2016-10-10
  • 解決laravel5.4下的group by報(bào)錯(cuò)的問題

    解決laravel5.4下的group by報(bào)錯(cuò)的問題

    今天小編就為大家分享一篇解決laravel5.4下的group by報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Laravel多條件where查詢語(yǔ)句使用詳解

    Laravel多條件where查詢語(yǔ)句使用詳解

    這篇文章主要為大家介紹了Laravel多條件where查詢語(yǔ)句使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • PHP連接和操作MySQL數(shù)據(jù)庫(kù)基礎(chǔ)教程

    PHP連接和操作MySQL數(shù)據(jù)庫(kù)基礎(chǔ)教程

    這篇文章主要介紹了PHP連接和操作MySQL數(shù)據(jù)庫(kù)基礎(chǔ)教程,本文講解了mysql擴(kuò)展、連接數(shù)據(jù)庫(kù)、與數(shù)據(jù)庫(kù)交互等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Laravel中encrypt和decrypt的實(shí)現(xiàn)方法

    Laravel中encrypt和decrypt的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Laravel中encrypt和decrypt的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評(píng)論