Heim > Backend-Entwicklung > PHP-Tutorial > Erste Erfahrung mit PHP Yield, Ordner rekursiv durchsuchen und komprimieren

Erste Erfahrung mit PHP Yield, Ordner rekursiv durchsuchen und komprimieren

巴扎黑
Freigeben: 2016-11-10 09:23:34
Original
1836 Leute haben es durchsucht

PHP durchläuft einen Ordner und komprimiert ihn in ZIP

PHP-Code

  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);
    }
Nach dem Login kopieren

Verwenden Sie yield, um den Code umzugestalten

PHP-Code

    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);
        }
    }
Nach dem Login kopieren

Codeausführung

PHP-Code

  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;;
        }
    }
Nach dem Login kopieren

|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- Verzögerung:1.602204 0843964
|zipFolder-delay:1.6297070980072| zip-delay: 1.7262189388275
|zipFolder-delay:1.5997030735016|zip-delay:1.5892019271851

Der Unterschied in der Ausführungszeit zwischen der Verwendung der Yield-Rekursion und der normalen Rekursion ist nicht groß. Der Hauptvorteil besteht in der Datenerfassung und Datenerfassung Die Verarbeitung ist getrennt, was das Verständnis und die Wiederverwendung erleichtert

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage