I'm using CodeIgniter and I can't figure out how to unzip files!
-
1A .gz file is different from a .zip file, even if normally a utility that is able to uncompress .zip files is also able to uncompress .gz files. – apaderno Jul 20 '10 at 18:41
5 Answers
PHP itself has a number of functions for dealing with gzip files.
If you want to create a new, uncompressed file, it would be something like this.
Note: This doesn't check if the target file exists first, doesn't delete the input file, or do any error checking. You really should fix those before using this in production code.
// 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);
Note: This deals with gzip only. It doesn't deal with tar.

- 87,612
- 17
- 125
- 175
-
1I used this code and it work perfects . just asking how to make it works with folders inside gz file and how to show output folder of extracted files . – Salem Mar 13 '15 at 08:33
-
2@RealMan gzip only supports single files. You need a .tar.gz for multiple files. I'm not sure if PHP has built-in support for tar or not. – Powerlord Mar 13 '15 at 20:14
gzopen is way too much work. This is more intuitive:
$zipped = file_get_contents("foo.gz");
$unzipped = gzdecode($zipped);
works on http pages when the server is spitting out gzipped data also.

- 1,496
- 14
- 15
-
1This is not a good idea, as it reads the entire file into memory. Using `gzopen` and using a buffer is the proper way to do this. – mbomb007 Aug 18 '22 at 20:16
-
Using gzopen would only be "better" with a huge file. We're not programming on VIC 20s or PHP 11s anymore. "proper" depends on the the application. The point of using PHP is so that we dont have to write complicated C-like code to do simple things. – Danial Nov 16 '22 at 20:28
-
A buffer is a common data structure used in high-level programming languages, not just C. PHP has file handles that need to be closed and memory to be stewarded. Protecting users from out of memory errors is important, and it's important for programmers to know these things. – mbomb007 Nov 16 '22 at 22:35
-
so someone wasted their time implementing gzdecode() according to you? Should no-one use json_decode or str_getcsv because the string may be too large for your liking? WHY does file_get_contents even exist if we can't use it because the file may be too large to read into memory? You're trying to be a smart guy by recognizing the 1 in a million case where the simple code may not work. Good programmers code for the 99.99% case. I can always shell to gzip for the one in million case where the file is enormous – Danial Nov 18 '22 at 00:01
If you have access to system():
system("gunzip file.sql.gz");

- 864
- 7
- 11
-
Should work but most of time system() will be disabled due to security reasons – fedmich Mar 05 '15 at 16:01
Use the functions implemented by the Zlib Compression extension.
This snippet shows how to use some of the functions made available from the extension:
// 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);

- 28,547
- 16
- 75
- 90
Download the Unzip library
and include or autoload
the unzip
library
$this->load->library('unzip');

- 1,492
- 2
- 17
- 24

- 377,238
- 77
- 533
- 578