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

问题描述 投票:0回答:10

我想使用 PHP 在我的服务器上 gzip 压缩文件。有人有一个输入文件并输出压缩文件的例子吗?

php compression gzip
10个回答
105
投票

这段代码可以解决问题

// 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);

104
投票

此处的其他答案在压缩期间将整个文件加载到内存中,这将导致大文件出现“内存不足”错误。下面的函数在大文件上应该更可靠,因为它以 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; }

更新: Gerben 发布了此函数的改进版本,该版本更清晰并使用异常,而不是在错误时返回 false。请参阅https://stackoverflow.com/a/56140427/195835


23
投票
此外,您还可以使用 php 的

wrapperscompression those。只需对代码进行最小的更改,您就可以在 gzip、bzip2 或 zip 之间切换。

$input = "test.txt"; $output = $input.".gz"; file_put_contents("compress.zlib://$output", file_get_contents($input));

compress.zlib://

 更改为 
compress.zip://
 以进行 zip 压缩
(请参阅对此答案有关 zip 压缩的评论),或将 compress.bzip2://
 更改为 bzip2 压缩。


7
投票
带有

gzencode() 的简单单行代码

gzencode(file_get_contents($file_name));
    

4
投票
这是一个改进的版本。我摆脱了所有嵌套的 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; }
    

3
投票
如果您只想解压缩文件,这可以工作并且不会导致内存问题:

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

3
投票
这对许多人来说可能是显而易见的,但如果您的系统上启用了任何程序执行功能(

exec

system
shell_exec
),您可以使用它们来简单地
gzip
文件。

exec("gzip ".$filename);

注意: 在使用 $filename

 变量之前,请务必对其进行适当的清理,特别是当它来自用户输入时(但不仅如此)。它可用于运行任意命令,例如包含类似 
my-file.txt && anothercommand
(或 
my-file.txt; anothercommand
)之类的内容。


0
投票
copy('file.txt', 'compress.zlib://' . 'file.txt.gz'); 请参阅

文档


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

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; }
    

0
投票
@Simon East 和 @Gerben 的函数都存储整个文件系统的路径,例如“/var/www/sites/example.com/path/to/my/file.gz”而不仅仅是“my/file.gz”

除非你尝试提取它,否则你不会知道

© www.soinside.com 2019 - 2024. All rights reserved.