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.' ';
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.
龙卷风之殇

浙公网安备 33010602011771号