PHP讀取大檔案的類SplFileObject使用介紹_php執行個體

來源:互聯網
上載者:User

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

複製代碼 代碼如下:
/** 返迴文件從X行到Y行的內容(支援php5、php4) 
 * @param string $filename 檔案名稱
 * @param int $startLine 開始的行數
 * @param int $endLine 結束的行數
 * @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);// 轉到第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);
    }
    return array_filter($content); // array_filter過濾:false,null,''
}
   
Ps: 上面都沒加”讀取到末尾的判斷”:!$fp->eof() 或者 !feof($fp),加上這個判斷影響效率,自己加上測試很多很多很多行的已耗用時間就曉得了,而且這裡加上也完全沒必要。
從上面的函數就可以看出來使用SplFileObject比下面的fgets要快多了,特別是檔案行數非常多、並且要取後面的內容的時候。fgets要兩個迴圈才可以,並且要迴圈$endLine次。
此方法花了不少功夫,測試了很多中寫法,就是想得出效率最高的方法。哪位覺得有值得改進的歡迎賜教。
使用,返回35270行-35280行的內容:
複製代碼 代碼如下:
echo '<pre>';
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>'; 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.