>  기사  >  백엔드 개발  >  PHP Yield에 대한 첫 번째 경험, 폴더를 재귀적으로 탐색하고 압축

PHP Yield에 대한 첫 번째 경험, 폴더를 재귀적으로 탐색하고 압축

巴扎黑
巴扎黑원래의
2016-11-10 09:23:341826검색

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-de 누워:1.602204 0843964
|zipFolder-delay:1.6297070980072| zip-delay: 1.7262189388275
|zipFolder-delay:1.5997030735016|zip-delay:1.5892019271851

Yield 재귀와 일반 재귀를 사용하는 경우의 실행 시간 차이가 크지 않다는 것이 가장 큰 장점입니다. 처리가 분리되어 이해하고 재사용하기가 더 쉽습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.