使用PHP怎么遍歷目錄文件和讀取超大文件?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)新羅,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575遍歷目錄文件
valid()) { yield $sub->current(); $sub->next(); } if ($include_dirs) yield $rfile; } else { yield $rfile; } } closedir($dh); } } // 使用 $glob = glob2foreach('/var/www'); while ($glob->valid()) { // 當(dāng)前文件 $filename = $glob->current(); // 這個(gè)就是包括路徑在內(nèi)的完整文件名了 // echo $filename; // 指向下一個(gè),不能少 $glob->next(); }
yield 返回的是生成器對(duì)象(不了解的可以先去了解一下 PHP 生成器),并沒(méi)有立即生成數(shù)組,所以目錄下文件再多也不會(huì)出現(xiàn)巨無(wú)霸數(shù)組的情況,內(nèi)存消耗是低到可以忽略不計(jì)的幾十 kb 級(jí)別,時(shí)間消耗也幾乎只有循環(huán)消耗。
讀取文本文件
valid()) { // 當(dāng)前行文本 $line = $glob->current(); // 逐行處理數(shù)據(jù) // $line // 指向下一個(gè),不能少 $glob->next(); }
通過(guò) yield 逐行讀取文件,具體使用多少內(nèi)存取決于每一行的數(shù)據(jù)量有多大,如果是每行只有幾百字節(jié)的日志文件,即使這個(gè)文件超過(guò)100M,占用內(nèi)存也只是KB級(jí)別。
但很多時(shí)候我們并不需要一次性讀完整個(gè)文件,比如當(dāng)我們想分頁(yè)讀取一個(gè)1G大小的日志文件的時(shí)候,可能想第一頁(yè)讀取前面1000行,第二頁(yè)讀取第1000行到2000行,這時(shí)候就不能用上面的方法了,因?yàn)槟欠椒m然占用內(nèi)存低,但是數(shù)以萬(wàn)計(jì)的循環(huán)是需要消耗時(shí)間的。
這時(shí)候,就改用 SplFileObject 處理,SplFileObject 可以從指定行數(shù)開(kāi)始讀取。下面例子是寫(xiě)入數(shù)組返回,可以根據(jù)自己業(yè)務(wù)決定要不要寫(xiě)入數(shù)組,我懶得改了。
seek($offset); $i = 0; while (! $fp->eof()) { // 必須放在開(kāi)頭 $i++; // 只讀 $count 這么多行 if ($i > $count) break; $line = $fp->current(); $line = trim($line); $arr[] = $line; // 指向下一個(gè),不能少 $fp->next(); } return $arr; }
以上所說(shuō)的都是文件巨大但是每一行數(shù)據(jù)量都很小的情況,有時(shí)候情況不是這樣,有時(shí)候是一行數(shù)據(jù)也有上百M(fèi)B,那這該怎么處理呢?
如果是這種情況,那就要看具體業(yè)務(wù)了,SplFileObject 是可以通過(guò) fseek 定位到字符位置(注意,跟 seek 定位到行數(shù)不一樣),然后通過(guò) fread 讀取指定長(zhǎng)度的字符。
也就是說(shuō)通過(guò) fseek 和 fread 是可以實(shí)現(xiàn)分段讀取一個(gè)超長(zhǎng)字符串的,也就是可以實(shí)現(xiàn)超低內(nèi)存處理,但是具體要怎么做還是得看具體業(yè)務(wù)要求允許你怎么做。
復(fù)制大文件
順便說(shuō)下 PHP 復(fù)制文件,復(fù)制小文件用 copy 函數(shù)是沒(méi)問(wèn)題的,復(fù)制大文件的話(huà)還是用數(shù)據(jù)流好,例子如下:
關(guān)于使用PHP怎么遍歷目錄文件和讀取超大文件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
當(dāng)前文章:使用PHP怎么遍歷目錄文件和讀取超大文件-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/cooish.html