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.

 

 

 

 

posted @ 2021-12-15 11:19  龙卷风之殇  阅读(179)  评论(0)    收藏  举报