本例是zip压缩重点是,被压缩的文件按照其目录结构压缩进zip压缩包。
重要说明:
1. 同时把不同目录按照其目录结构压缩至同一zip文件,$zipFile内容目录结构不变,$folderPaths此时为数组 ['app/data/','public/data/'];数组内为不同目录路径
2. 把单个目录进行压缩,且压缩包内的目录保持其结构不变,$folderPaths此时为路径字符串'app/data/';
3. root_path() 为thinkphp的root绝对路径,此处为压缩包内保持目录结构相对路径的关键。
/**
     * 保持目录结构的压缩方法
     * @param string $zipFile
     * @param $folderPaths
     * @return void
     */
    public static function dirZip(string $zipFile, $folderPaths)
    {
        //1. $folderPaths 路径为数组
        // 初始化zip对象
        $zip = new \ZipArchive();
        //打开压缩文件
        $zip->open($zipFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
        if(is_array($folderPaths)) {
            foreach($folderPaths as $folderPath) {
                // 被压缩文件绝对路径
                $rootPath = realpath($folderPath);
                // Create recursive directory iterator
                //获取所有文件数组SplFileInfo[] $files
                $files = new \RecursiveIteratorIterator(
                    new \RecursiveDirectoryIterator($rootPath),
                    \RecursiveIteratorIterator::LEAVES_ONLY
                );
                foreach ($files as $name => $file) {
                    //要跳过所有子目录
                    if (!$file->isDir()) {
                        // 真实文件路径
                        $filePath = $file->getRealPath();
                        // zip文件的相对路径
                        $relativePath = str_replace(root_path(), '', $filePath);
                        //添加文件到压缩包
                        $zip->addFile($filePath, $relativePath);
                    }
                }
            }
        } else {
            // 2. $folderPaths 路径为string
            // 被压缩文件绝对路径
            $rootPath = realpath($folderPaths);
            // Create recursive directory iterator
            //获取所有文件数组SplFileInfo[] $files
            $files = new \RecursiveIteratorIterator(
                new \RecursiveDirectoryIterator($rootPath),
                \RecursiveIteratorIterator::LEAVES_ONLY
            );
            foreach ($files as $name => $file) {
                //要跳过所有子目录
                if (!$file->isDir()) {
                    //  要压缩的文件路径
                    $filePath = $file->getRealPath();
                    // zip目录内文件的相对路径
                    $relativePath = str_replace(root_path(), '', $filePath);
                    //添加文件到压缩包
                    $zip->addFile($filePath, $relativePath);
                }
            }
        }
        $zip->close();
    }