在PHP中使用array_pop + yield實(shí)現(xiàn)讀取超大型目錄功能示例
php  /  管理員 發(fā)布于 10個(gè)月前   470
在php中需要讀取處理一個(gè)超大型目錄,該單目錄有200G大小;
一般常規(guī)做法是:
使用遞歸實(shí)現(xiàn),不過(guò)讀取到的路徑數(shù)組非常大,配置不行的機(jī)器分分鐘內(nèi)存溢出.
看看常規(guī)遞歸實(shí)現(xiàn)代碼:
function recursiveScan($dir) {
$files = [];
$items = scandir($dir);
foreach ($items as $item) {
if ($item == '.' || $item == '..') {
continue;
}
$path = $dir . '/' . $item;
if (is_dir($path)) {
$files = array_merge($files, recursiveScan($path)); // 遞歸讀取子目錄
} else {
$files[] = $path;
}
}
return $files;
}
$directory = '/path/to/directory';
$files = recursiveScan($directory);
foreach ($files as $file) {
echo $file . PHP_EOL;
}
以上是很常見(jiàn)的做法,讀取小文件夾沒(méi)問(wèn)題,但是大文件夾會(huì)超出內(nèi)存
優(yōu)化解決思路:
1、在這個(gè)優(yōu)化后的函數(shù)中,我們將 traverseFolder 函數(shù)改為生成器函數(shù),并使用 yield $path;
逐步生成文件路徑。
這樣在調(diào)用這個(gè)函數(shù)時(shí),可以逐步處理文件而不是一次性返回所有文件路徑。
這種方式可以減少內(nèi)存占用,并在需要時(shí)逐個(gè)獲取文件路徑。
2、不使用遞歸這種耗資源的方式, 使用 array_pop 棧的思路來(lái)模擬迭代
改進(jìn)過(guò)的方法如下,非常的節(jié)省內(nèi)存,
默認(rèn) 128m 的配置即可讀取超大目錄:
優(yōu)化示例代碼:
function traverseFolder($folder) {
$stack = [$folder]; // 使用棧來(lái)模擬迭代
$ext_map = $this->config('ext_map');
$ext_map_arr = explode("\n", $ext_map);
while (!empty($stack)) {
$currentFolder = array_pop($stack);
$handle = opendir($currentFolder);
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..') {
$path = $currentFolder . '/' . $file;
if (is_dir($path)) {
$stack[] = $path;
} else {
yield $path; // 生成器函數(shù)逐步生成文件路徑
}
}
}
closedir($handle);
}
}
調(diào)用示例:
使用就直接用foreach循環(huán)上面的結(jié)果, 返回$path即可;
這樣就可以輕松讀取 200G 甚至 2T 的文件夾了.
123 在
Clash for Windows作者刪庫(kù)跑路了,github已404中評(píng)論 按理說(shuō)只要你在國(guó)內(nèi),所有的流量進(jìn)出都在監(jiān)控范圍內(nèi),不管你怎么隱藏也沒(méi)用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最簡(jiǎn)單的方法中評(píng)論 好久好久都沒(méi)看友情鏈接申請(qǐng)了,今天剛看,已經(jīng)添加。..博主 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見(jiàn)問(wèn)題以及解決辦法中評(píng)論 @1111老鐵這個(gè)不行了,可以看看近期評(píng)論的其他文章..1111 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見(jiàn)問(wèn)題以及解決辦法中評(píng)論 網(wǎng)站不能打開(kāi),博主百忙中能否發(fā)個(gè)APP下載鏈接,佛跳墻或極光..路人 在
php中使用hyperf框架調(diào)用訊飛星火大模型實(shí)現(xiàn)國(guó)內(nèi)版chatgpt功能示例中評(píng)論 教程很詳細(xì),如果加個(gè)前端chatgpt對(duì)話頁(yè)面就完美了..
Copyright·? 2019 侯體宗版權(quán)所有·
粵ICP備20027696號(hào)