1. 程式人生 > 其它 >PHP --scandir遞迴檔案留下的坑

PHP --scandir遞迴檔案留下的坑

好久沒寫博文了,這次主要更新的是我上次工作中留下的一個大坑--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.'&nbsp;';
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.

 

 

龍捲風之殤