php gzip压缩

2021-03-18

压缩

/**
 * @description: 压缩指定目录或指定文件
 * @param string $dir 要压缩的目录,默认为当前目录
 * @param array $files 要压缩的文件数组,[['name'=>'','path'=>'']]$files指定时,$dir参数不生效
 * @param string $gen_dir 生成压缩包位置,默认当前位置
 * @param string $name 压缩后的文件名,默认自动生成
 * @return bool
 */
function compress($dir = './', $files = [], $gen_dir = './', $name = null)
{
    !is_dir($gen_dir) && mkdir(iconv('utf-8', 'gbk', $gen_dir), 0777, true);
    $gzname = str_replace('\\', '/', realpath($gen_dir)) . '/' . ($name ?: (time() . bin2hex(random_bytes(8)))) . '.tar';
    
    @unlink($gzname);
    @unlink($gzname . '.gz');

    $tar = new PharData($gzname);
    if ($files) {
        foreach ($files as $file) {
            $tar[$file['name']] = file_get_contents($file['path']);
        }
    } else {
        $tar->buildFromDirectory($dir);
    }
    $tar->compress(Phar::GZ);
    @unlink($gzname);
    return $gzname . '.gz';
}

$file = [
    ['name'=>'11.txt','path'=>'C:\Users\Administrator\Desktop\中文\1.txt'],
    ['name'=>'22.txt','path'=>'C:\Users\Administrator\Desktop\中文\2.txt'],
    ['name'=>'33.txt','path'=>'C:\Users\Administrator\Desktop\中文\3.txt'],
];
compress('C:\Users\Administrator\Desktop\中文', $file, 'C:\Users\Administrator\Desktop\中文1', '是什么啊');

解压缩

/**
 * @description: 解压缩文件,压缩文件中的文件会覆盖解压目录的文件
 * @param string $filename 要解压的文件
 * @param string $dir 解压的位置,默认文件所在位置
 * @return bool
 */
function uncompress($filename, $dir = '')
{
    !$dir && $dir = pathinfo($filename, PATHINFO_DIRNAME);
    !is_dir($dir) && mkdir(iconv('utf-8', 'gbk', $dir), 0777, true);
    $dir = str_replace('\\', '/', $dir) . '/';
    
    $tar = new PharData($filename);
    $tar->decompress();
    // true解压时会覆盖现有文件
    $tar->extractTo($dir, null, true);
    @unlink(rtrim($filename, '.gz'));
}

uncompress('C:\Users\Administrator\Desktop\中文1\是什么.tar.gz');

 

{/if}