這篇文章主要介紹“PHP中的大文件讀取操作”,在日常操作中,相信很多人在PHP中的大文件讀取操作問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP中的大文件讀取操作”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出萊西免費(fèi)做網(wǎng)站回饋大家。
簡(jiǎn)單的文件讀取,一般我們會(huì)使用 file_get_contents() 這類方式來(lái)直接獲取文件的內(nèi)容。不過(guò)這種函數(shù)有個(gè)嚴(yán)重的問(wèn)題是它會(huì)把文件一次性地加載到內(nèi)存中,也就是說(shuō),它會(huì)受到內(nèi)存的限制。因此,加載大文件的時(shí)候是絕對(duì)不能使用這種方式的。我們還是先看看這種方式加載的例子。
// 普通的文件讀取 一個(gè)2.4G的SQL導(dǎo)出文件
$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
上述三種形式的文件加載讀取方式都是不能加載這么大的文件的,當(dāng)然,你也可以修改 php.ini 中的相關(guān)配置讓他們能夠加載成功,但我們并不推薦這樣使用,畢竟內(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();
}
第一個(gè) readfile() ,讀取文件后就直接打印了,不能進(jìn)行其他操作,適用于直接顯示大文件內(nèi)容時(shí)使用。
第二個(gè) fopen() 配合 fgetc() 或 fgets() 是讀取這種大文件的標(biāo)配。fopen() 獲取文件句柄,fgetc() 按字符讀取,fgets() 按行讀取。像這個(gè) MySQLdump 出來(lái)的文件,一行也可能非常的大,所以我們就只能直接按字符讀取。
第三個(gè)是SPL擴(kuò)展庫(kù)為我們提供的面向?qū)ο笫降?fopen() 操作,建議新的開(kāi)發(fā)中如果有讀取大文件的需求最好使用這種形式的寫(xiě)法,畢竟SPL函數(shù)庫(kù)已經(jīng)是PHP的標(biāo)準(zhǔn)函數(shù)庫(kù)了,而且面向?qū)ο蟮牟僮餍问揭哺拥闹髁鳌?/p>
上面三種讀取方式都有一個(gè)要注意的點(diǎn)是,我們將大文件讀取后不應(yīng)該再保存到變量中,應(yīng)該直接打印顯示、入庫(kù)或者寫(xiě)到其他文件中。因?yàn)橹苯幼x取到一個(gè)變量中就和前面的直接讀取到內(nèi)存的方式一樣了,那還不如直接去修改下 php.ini 的配置然后使用最上方的方式直接讀取到內(nèi)存方便。還是那句話,內(nèi)存留給真正需要它的地方,這種大文件,最好還是進(jìn)行硬盤的IO操作。
測(cè)試代碼: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
到此,關(guān)于“PHP中的大文件讀取操作”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!