如何使用PHP解压缩.gz文件?

15

我正在使用CodeIgniter,但是我不知道如何解压文件!


1
一个 .gz 文件和一个 .zip 文件是不同的,即使通常能够解压缩 .zip 文件的工具也能够解压缩 .gz 文件。 - apaderno
5个回答

53

PHP本身具有处理gzip文件的多种功能。

如果要创建一个新的未压缩文件,可以像这样进行操作。

注意:此操作不会首先检查目标文件是否存在,也不会删除输入文件或进行任何错误检查。在使用此操作之前,您确实应该解决这些问题。

// This input should be from somewhere else, hard-coded in this example
$file_name = 'file.txt.gz';

// Raising this value may increase performance
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace('.gz', '', $file_name);

// Open our files (in binary mode)
$file = gzopen($file_name, 'rb');
$out_file = fopen($out_file_name, 'wb');

// Keep repeating until the end of the input file
while(!gzeof($file)) {
    // Read buffer-size bytes
    // Both fwrite and gzread and binary-safe
    fwrite($out_file, gzread($file, $buffer_size));
}

// Files are done, close files
fclose($out_file);
gzclose($file);

注意:此处仅涉及gzip,不涉及tar。


1
我使用了这段代码,它完美地运行了。只是想问一下如何使其能够处理gz文件内部的文件夹,并且如何显示提取文件的输出文件夹。 - Salem
2
@gzip仅支持单个文件。您需要使用.tar.gz来处理多个文件。我不确定PHP是否具有内置的tar支持。 - Powerlord

11

gzopen太麻烦了。这个更加直观:

$zipped = file_get_contents("foo.gz");
$unzipped = gzdecode($zipped);

当服务器输出压缩数据时,可以在http页面上使用。


1
这不是一个好主意,因为它会将整个文件读入内存。使用gzopen并使用缓冲区才是正确的方法。 - mbomb007
使用gzopen只有在处理大文件时才会更好。我们不再使用VIC 20或PHP 11进行编程了。"适当"取决于应用程序。使用PHP的目的是为了避免编写复杂的类似C的代码来完成简单的任务。 - Danial
缓冲区是高级编程语言中常用的数据结构,不仅限于C语言。PHP有需要关闭的文件句柄和需要管理的内存。保护用户免受内存错误的影响非常重要,程序员了解这些知识也同样重要。 - mbomb007
所以,根据您的说法,有人浪费了时间实现gzdecode()?难道没有人使用json_decode或str_getcsv,因为字符串可能太大而不适合您的口味?如果文件太大而无法读入内存,为什么还会存在file_get_contents?您试图成为一个聪明人,认识到简单代码可能无法工作的一百万分之一的情况。好的程序员为99.99%的情况编写代码。我总是可以使用gzip来处理巨大文件的那个一百万分之一的情况。 - Danial

6
如果您可以访问system()函数:
system("gunzip file.sql.gz");

应该可以工作,但由于安全原因,大部分时间system()函数将被禁用。 - fedmich

3

使用由Zlib压缩扩展实现的函数。

这段代码展示了如何使用该扩展所提供的一些函数:

// open file for reading
$zp = gzopen($filename, "r");

// read 3 char
echo gzread($zp, 3);

// output until end of the file and close it.
gzpassthru($zp);
gzclose($zp);

1

下载Unzip库,并且包含或者自动加载 unzip 库。

$this->load->library('unzip');

链接已失效..如果可能的话,让我找到链接并更新此内容。 - fedmich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接