亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在PHP中利用SplFileObject讀取大文件

發布時間:2021-01-15 17:02:00 來源:億速云 閱讀:369 作者:Leah 欄目:開發技術

怎么在PHP中利用SplFileObject讀取大文件?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

如果加載的文件特別大時,如幾百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>'; 

關于怎么在PHP中利用SplFileObject讀取大文件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐城市| 遂川县| 象州县| 喀什市| 延寿县| 安岳县| 无为县| 吉木萨尔县| 开原市| 青铜峡市| 盐边县| 富蕴县| 商丘市| 赫章县| 邳州市| 惠州市| 沙洋县| 桂阳县| 蕲春县| 盈江县| 三穗县| 湛江市| 广汉市| 连江县| 赞皇县| 朝阳区| 同心县| 江津市| 兰西县| 普洱| 普宁市| 安平县| 石渠县| 建宁县| 玛沁县| 长汀县| 名山县| 新建县| 铜梁县| 河北区| 宝清县|