如何使用PHP创建.gz文件?

kx5bkwkv  于 2023-01-12  发布在  PHP
关注(0)|答案(9)|浏览(150)

我想用PHP在我的服务器上用gzip压缩一个文件。有没有人有一个例子,将输入一个文件和输出一个压缩文件?

chhkpiq4

chhkpiq41#

这段代码可以完成这个任务

// Name of the file we're compressing
$file = "test.txt";

// Name of the gz file we're creating
$gzfile = "test.gz";

// Open the gz file (w9 is the highest compression)
$fp = gzopen ($gzfile, 'w9');

// Compress the file
gzwrite ($fp, file_get_contents($file));

// Close the gz file and we're done
gzclose($fp);
vsdwdz23

vsdwdz232#

这里的其他答案在压缩过程中将整个文件加载到内存中,这将导致大文件出现“out of memory”错误。下面的函数在大文件上应该更可靠,因为它以512kb的块读取和写入文件。

/**
 * GZIPs a file on disk (appending .gz to the name)
 *
 * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
 * Based on function by Kioob at:
 * http://www.php.net/manual/en/function.gzwrite.php#34955
 * 
 * @param string $source Path to file that should be compressed
 * @param integer $level GZIP compression level (default: 9)
 * @return string New filename (with .gz appended) if success, or false if operation fails
 */
function gzCompressFile($source, $level = 9){ 
    $dest = $source . '.gz'; 
    $mode = 'wb' . $level; 
    $error = false; 
    if ($fp_out = gzopen($dest, $mode)) { 
        if ($fp_in = fopen($source,'rb')) { 
            while (!feof($fp_in)) 
                gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
            fclose($fp_in); 
        } else {
            $error = true; 
        }
        gzclose($fp_out); 
    } else {
        $error = true; 
    }
    if ($error)
        return false; 
    else
        return $dest; 
}
  • UPDATE:* Gerben发布了这个函数的改进版本,它更简洁,使用异常而不是在出错时返回false。
kdfy810k

kdfy810k3#

同样,你也可以使用php的wrapperscompression ones,只需对代码做一个最小的改动,你就可以在gzip,bzip2或者zip之间切换。

$input = "test.txt";
$output = $input.".gz";

file_put_contents("compress.zlib://$output", file_get_contents($input));

compress.zlib://更改为compress.zip://以进行zip压缩 (请参见此答案的注解),或将compress.bzip2://更改为bzip2压缩。

4xrmg8kj

4xrmg8kj4#

gzencode()的简单单内衬:

gzencode(file_get_contents($file_name));
jpfvwuh4

jpfvwuh45#

如果你只是想解压缩一个文件,这是可行的,不会导致内存问题:

$bytes = file_put_contents($destination, gzopen($gzip_path, r));
xqnpmsa8

xqnpmsa86#

这对许多人来说可能是显而易见的,但是如果在您的系统上启用了任何程序执行函数(execsystemshell_exec),您就可以使用它们来简单地gzip文件。

exec("gzip ".$filename);

**N.B.:**使用$filename变量之前,请确保对其进行适当的清理,尤其是当它来自用户输入时(但不仅限于此)。它可能被用来运行任意命令,例如,通过包含类似my-file.txt && anothercommand(或my-file.txt; anothercommand)的内容。

p3rjfoxz

p3rjfoxz7#

这是一个改进的版本。我去掉了所有嵌套的if/else语句,降低了圈复杂度,通过异常更好地处理错误,而不是跟踪布尔错误状态,一些类型提示,如果文件已经有gz扩展名,我就退出。代码行有点长,但可读性更强。

/**
 * Compress a file using gzip
 *
 * Rewritten from Simon East's version here:
 * https://stackoverflow.com/a/22754032/3499843
 *
 * @param string $inFilename Input filename
 * @param int    $level      Compression level (default: 9)
 *
 * @throws Exception if the input or output file can not be opened
 *
 * @return string Output filename
 */
function gzcompressfile(string $inFilename, int $level = 9): string
{
    // Is the file gzipped already?
    $extension = pathinfo($inFilename, PATHINFO_EXTENSION);
    if ($extension == "gz") {
        return $inFilename;
    }

    // Open input file
    $inFile = fopen($inFilename, "rb");
    if ($inFile === false) {
        throw new \Exception("Unable to open input file: $inFilename");
    }

    // Open output file
    $gzFilename = $inFilename.".gz";
    $mode = "wb".$level;
    $gzFile = gzopen($gzFilename, $mode);
    if ($gzFile === false) {
        fclose($inFile);
        throw new \Exception("Unable to open output file: $gzFilename");
    }

    // Stream copy
    $length = 512 * 1024; // 512 kB
    while (!feof($inFile)) {
        gzwrite($gzFile, fread($inFile, $length));
    }

    // Close files
    fclose($inFile);
    gzclose($gzFile);

    // Return the new filename
    return $gzFilename;
}
bttbmeg0

bttbmeg08#

压缩文件夹以满足任何人的需要

function gzCompressFile($source, $level = 9)
{
    $tarFile = $source . '.tar';

    if (is_dir($source)) {
        $tar = new PharData($tarFile);
        $files = scandir($source);
        foreach ($files as $file) {
            if (is_file($source . '/' . $file)) {
                $tar->addFile($source . '/' . $file, $file);
            }
        }
    }

    $dest = $tarFile . '.gz';
    $mode = 'wb' . $level;
    $error = false;
    if ($fp_out = gzopen($dest, $mode)) {
        if ($fp_in = fopen($tarFile, 'rb')) {
            while (!feof($fp_in))
                gzwrite($fp_out, fread($fp_in, 1024 * 512));
            fclose($fp_in);
        } else {
            $error = true;
        }
        gzclose($fp_out);
        unlink($tarFile);
    } else {
        $error = true;
    }
    if ($error)
        return false;
    else
        return $dest;
}
kfgdxczn

kfgdxczn9#

复制(“文件. txt”,“压缩. zlib://”.“文件. txt. gz”);参见文件

相关问题