溫馨提示×

溫馨提示×

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

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

PHP中的大文件讀取操作

發(fā)布時間:2021-07-13 15:46:45 來源:億速云 閱讀:132 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“PHP中的大文件讀取操作”,在日常操作中,相信很多人在PHP中的大文件讀取操作問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中的大文件讀取操作”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

 

PHP大文件讀取操作

簡單的文件讀取,一般我們會使用 file_get_contents() 這類方式來直接獲取文件的內(nèi)容。不過這種函數(shù)有個嚴重的問題是它會把文件一次性地加載到內(nèi)存中,也就是說,它會受到內(nèi)存的限制。因此,加載大文件的時候是絕對不能使用這種方式的。我們還是先看看這種方式加載的例子。

// 普通的文件讀取 一個2.4G的SQL導出文件
$fileName= './2020-02-23.sql';

// file_get_contents
$fileInfo = file_get_contents($fileName);
// Fatal error: Allowed memory size of 134217728 bytes exhausted

// file
$fileInfo = file($fileName);
// Fatal error: Allowed memory size of 134217728 bytes exhausted

// fopen + fread
$fileHandle = fopen($fileName, 'r');
$fileInfo = fread($fileHandle, filesize($fileName));
// Fatal error: Allowed memory size of 134217728 bytes exhausted
 

上述三種形式的文件加載讀取方式都是不能加載這么大的文件的,當然,你也可以修改 php.ini 中的相關配置讓他們能夠加載成功,但我們并不推薦這樣使用,畢竟內(nèi)存資源相比硬盤資源還是要寶貴的多。

以下的方式是可以直接讀取這種大文件的:

// readfile 只能直接輸出
echo readfile($fileName);

// fopen + fgetc 如果單
$fileHandle = fopen($fileName, 'r');
// 輸出單字符直到 end-of-file
while(!feof($fileHandle)) {
    echo fgetc($fileHandle);
}
fclose($fileHandle);

// SplFileObject
$fileObject = new SplFileObject($fileName, 'r');
while(!$fileObject->eof()){
    echo $fileObject->fgetc();
}
 

第一個 readfile() ,讀取文件后就直接打印了,不能進行其他操作,適用于直接顯示大文件內(nèi)容時使用。

第二個 fopen() 配合 fgetc() 或 fgets() 是讀取這種大文件的標配。fopen() 獲取文件句柄,fgetc() 按字符讀取,fgets() 按行讀取。像這個 mysqldump 出來的文件,一行也可能非常的大,所以我們就只能直接按字符讀取。

第三個是SPL擴展庫為我們提供的面向?qū)ο笫降?fopen() 操作,建議新的開發(fā)中如果有讀取大文件的需求最好使用這種形式的寫法,畢竟SPL函數(shù)庫已經(jīng)是PHP的標準函數(shù)庫了,而且面向?qū)ο蟮牟僮餍问揭哺拥闹髁鳌?/p>

上面三種讀取方式都有一個要注意的點是,我們將大文件讀取后不應該再保存到變量中,應該直接打印顯示、入庫或者寫到其他文件中。因為直接讀取到一個變量中就和前面的直接讀取到內(nèi)存的方式一樣了,那還不如直接去修改下 php.ini 的配置然后使用最上方的方式直接讀取到內(nèi)存方便。還是那句話,內(nèi)存留給真正需要它的地方,這種大文件,最好還是進行硬盤的IO操作。

測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/PHP%E5%A4%A7%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C.php

到此,關于“PHP中的大文件讀取操作”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

php
AI