PHP --scandir遞迴檔案留下的坑
阿新 • • 發佈:2021-12-15
好久沒寫博文了,這次主要更新的是我上次工作中留下的一個大坑--static。
我們先來看下我以前的程式碼:
/**獲取檔案結構 * @param $url //zip檔案url */ public static function getFileInfoJson($url,$zip_file_name,$rand_str){ //遠端下載解壓解密 $ffmpeg = new Util_Ffmpeg(); //將遠端壓縮包儲存到本地 Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始儲存遠端壓縮檔案========="); $local_file = $ffmpeg->urlToLocal($url); Util_Log::write(Util_Log::LOG_TYPE_INFO, "建立本地資料夾========="); $name = Util_Function::getUniqueId(); $dir_name = Util_Function::makeDir($name); Util_Log::write(Util_Log::LOG_TYPE_INFO, "本地資料夾建立成功=========".$dir_name); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始解壓========="); $zip = new ZipArchive() ; if ($zip->open($local_file) !== TRUE) Util_Request::responseFail('打不開壓縮檔案'); Util_Log::write(Util_Log::LOG_TYPE_INFO, "解壓檔案到指定目錄========="); //處理中文亂碼問題--start $fileNum = $zip->numFiles; for ($i = 0; $i < $fileNum; $i++) { $statInfo = $zip->statIndex($i, ZipArchive::FL_ENC_RAW); $zip->renameIndex($i, iconv('GBK', 'utf-8//IGNORE', $statInfo['name'])); } $zip->close(); $zip->open($local_file); //處理中文亂碼問題--end $zip->extractTo($dir_name); $zip->close(); Util_Log::write(Util_Log::LOG_TYPE_INFO, "完成解壓========="); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始遍歷資料夾獲取檔案========="); //開始遍歷資料夾並上傳 $file_list = self::list_file($dir_name);Util_Log::write(Util_Log::LOG_TYPE_INFO, "得到的所有檔案及資料夾=========".json_encode($file_list)); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始格式化檔案========="); $result = self::getForMate($file_list,$zip_file_name,$rand_str); return $result; } //遞迴遍歷資料夾並輸出
public static function list_file($dir){
static $file_list = [];
$list = scandir($dir);
foreach($list as $file){
$file_location = $dir."/".$file;
if($file !="." && $file !=".."){
$file_list[] = $file_location;
if(is_dir($file_location)){
list_file($file_location);
}
}
}
return $file_list;
}
按理說,我們遞迴檔案得出的檔案也沒問題,一個檔案一個檔案上傳發現不了錯誤。
但是批量上傳zip的時候就有問題了,得出的檔案會疊加上一次的檔案,越來越大。
我們主要是因為用了static,static靜態變數,導致批量檔案疊加。
function Test(){
static $count = 0;
$count ++;
echo $count.' ';
if($count <10){
Test();
}
}
Test();
//output 1 2 3 4 5 6 7 8 9 10
證明static 會保留以前的資料基礎上再增加
這時候我們來改造下:
public static function getFileInfoJson($url,$zip_file_name,$rand_str){ //遠端下載解壓解密 $ffmpeg = new Util_Ffmpeg(); //將遠端壓縮包儲存到本地 Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始儲存遠端壓縮檔案========="); $local_file = $ffmpeg->urlToLocal($url); Util_Log::write(Util_Log::LOG_TYPE_INFO, "建立本地資料夾========="); $name = Util_Function::getUniqueId(); $dir_name = Util_Function::makeDir($name); Util_Log::write(Util_Log::LOG_TYPE_INFO, "本地資料夾建立成功=========".$dir_name); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始解壓========="); $zip = new ZipArchive() ; if ($zip->open($local_file) !== TRUE) Util_Request::responseFail('打不開壓縮檔案'); Util_Log::write(Util_Log::LOG_TYPE_INFO, "解壓檔案到指定目錄========="); //處理中文亂碼問題--start $fileNum = $zip->numFiles; for ($i = 0; $i < $fileNum; $i++) { $statInfo = $zip->statIndex($i, ZipArchive::FL_ENC_RAW); $zip->renameIndex($i, iconv('GBK', 'utf-8//IGNORE', $statInfo['name'])); } $zip->close(); $zip->open($local_file); //處理中文亂碼問題--end $zip->extractTo($dir_name); $zip->close(); Util_Log::write(Util_Log::LOG_TYPE_INFO, "完成解壓========="); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始遍歷資料夾獲取檔案========="); //開始遍歷資料夾並上傳 $GLOBALS['file_list'] = []; $file_list = self::list_file($dir_name); $file_list = $GLOBALS['file_list']; Util_Log::write(Util_Log::LOG_TYPE_INFO, "得到的所有檔案及資料夾=========".json_encode($file_list)); Util_Log::write(Util_Log::LOG_TYPE_INFO, "開始格式化檔案========="); $result = self::getForMate($file_list,$zip_file_name,$rand_str); return $result; } //遞迴遍歷資料夾並輸出 public static function list_file($dir){ $list = scandir($dir); foreach($list as $file){ $file_location = $dir."/".$file; if($file !="." && $file !=".."){ $GLOBALS['file_list'][] = $file_location; if(is_dir($file_location)){ self::list_file($file_location); } } } }
這時候我們採用了 $GLOBALS變數來初始化變數達到解決我們程式碼bug.
龍捲風之殤