Heim  >  Artikel  >  Backend-Entwicklung  >  php yield初体验,递归遍历文件夹并压缩

php yield初体验,递归遍历文件夹并压缩

巴扎黑
巴扎黑Original
2016-11-10 09:23:341777Durchsuche

php遍历一个文件夹并压缩到zip 

Php代码  

  private function zip($path,$zipFile){
        $zip=new ZipArchive();
        $zip->open($zipFile,ZipArchive::CREATE);//创建一个空的zip文件
        $this->addFileToZip($path,$zip);
    }
    private function addFileToZip($path,ZipArchive $zip,$root=''){
        if(!is_dir($path)){
            return false;
        }
        if(!$root){
            $root= $path;
        }
        if(strpos($path,$root)!==0){
            $root= $path;
        }
        $handler=opendir($path); //打开当前文件夹由$path指定。
        while(($filename=readdir($handler))!==false){
            if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
                if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                    $this->addFileToZip($path."/".$filename, $zip,$root);
                }else{ //将文件加入zip对象
                    $filenameWithPath = $path."/".$filename;
                    $localFileName = substr($filenameWithPath,strlen($root));
                    $zip->addFile($filenameWithPath,$localFileName);
                }
            }
        }
        @closedir($handler);
    }

使用yield重构代码 

Php代码  

    private function zipFolder($folder,$zipFile){
        $zip=new ZipArchive();
        $zip->open($zipFile,ZipArchive::CREATE);//创建一个空的zip文件
        foreach($this->yieldFile($folder) as $file){
            $localFileName = substr($file,strlen($folder));
            $zip->addFile($file,$localFileName);
        }
    }
    private function yieldFile($path){
        if(is_dir($path)){
            $handler = opendir($path);
            while(($filename=readdir($handler))!==false){
                if($filename != "." && $filename != "..") {//文件夹文件名字为'.'和‘..’,不要对他们进行操作
                    if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                        foreach($this->yieldFile($path."/".$filename) as $file){
                            yield $file;
                        }
                    }else{ //将文件加入zip对象
                        $file = $path."/".$filename;
                        yield $file;
                    }
                }
            }
            closedir($handler);
        }
    }

代码执行 

Php代码  

  public function anyZip(){
        for($i=0;$i<6;$i++) {
            $start = microtime(true);
            $toPath = &#39;D:/unzip&#39;;
            $this->zipFolder($toPath, &#39;d:/zip/123.zip&#39;);
            $end = microtime(true);
            echo &#39;|zipFolder-delay:&#39; . ($end - $start);
            $start = microtime(true);
            $toPath = &#39;D:/unzip&#39;;
            $this->zip($toPath, &#39;d:/zip/124.zip&#39;);
            $end = microtime(true);
            echo &#39;|zip-delay:&#39; . ($end - $start) . &#39;<br>&#39;;
        }
    }

|zipFolder-delay:1.6427090167999|zip-delay:1.6077039241791 
|zipFolder-delay:1.6132049560547|zip-delay:1.6287071704865 
|zipFolder-delay:1.6342070102692|zip-delay:1.6152048110962 
|zipFolder-delay:1.6917150020599|zip-delay:1.6022040843964 
|zipFolder-delay:1.6297070980072|zip-delay:1.7262189388275 
|zipFolder-delay:1.5997030735016|zip-delay:1.5892019271851 

使用yield递归和正常的递归执行时间差距不大,主要好处是将数据获取和数据处理拆分开,更易理解和复用

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn