Reading and Writing .gz files in PHP
By: David Sklar
You want to read or write compressed files. Use PHP's zlib extension to read or write gzip'ed files. To read a compressed file:
$zh = gzopen('file.gz','r') or die("can't open: $php_errormsg"); while ($line = gzgets($zh,1024)) { // $line is the next line of uncompressed data, up to 1024 bytes } gzclose($zh) or die("can't close: $php_errormsg");
Here's how to write a compressed file:
$zh = gzopen('file.gz','w') or die("can't open: $php_errormsg"); if (-1 == gzwrite($zh,$s)) { die("can't write: $php_errormsg"); } gzclose($zh) or die("can't close: $php_errormsg");
The zlib extension contains versions of many file-access functions, such as fopen(), fread(), and fwrite() (called gzopen(), gzread(), gzwrite(), etc.) that transparently compress data when writing and uncompress data when reading. The compression algorithm that zlib uses is compatible with the gzip and gunzip utilities.
For example, gzgets($zp,1024) works like fgets($fh,1024). It reads up to 1023 bytes, stopping earlier if it reaches EOF or a newline. For gzgets( ), this means 1023 uncompressed bytes.
However, gzseek() works differently than fseek(). It only supports seeking a specified number of bytes from the beginning of the file stream (the SEEK_SET argument to fseek( )). Seeking forward (from the current position) is only supported in files opened for writing (the file is padded with a sequence of compressed zeroes). Seeking backwards is supported in files opened for reading, but it is very slow.
The zlib extension also has some functions to create compressed strings. The function gzencode( )compresses a string and gives it the correct headers and formatting to be compatible with gunzip. Here's a simple gzip program:
$in_file = $_SERVER['argv'][1]; $out_file = $_SERVER['argv'][1].'.gz'; $ifh = fopen($in_file,'rb') or die("can't open $in_file: $php_errormsg"); $ofh = fopen($out_file,'wb') or die("can't open $out_file: $php_errormsg"); $encoded = gzencode(fread($ifh,filesize($in_file))) or die("can't encode data: $php_errormsg"); if (-1 == fwrite($ofh,$encoded)) { die("can't write: $php_errormsg"); } fclose($ofh) or die("can't close $out_file: $php_errormsg"); fclose($ifh) or die("can't close $in_file: $php_errormsg");
The guts of this program are the lines:
$encoded = gzencode(fread($ifh,filesize($in_file))) or die("can't encode data: $php_errormsg); if (-1 == fwrite($ofh,$encoded)) { die("can't write: $php_errormsg"); }
The compressed contents of $in_file are stored in $encoded and then written to $out_file with fwrite( ).
You can pass a second argument to gzencode( ) that indicates compression level. Set no compression with 0 and maximum compression with 9. The default level is 1. To adjust the simple gzip program for maximum compression, the encoding line becomes:
$encoded = gzencode(fread($ifh,filesize($in_file)),9) or die("can't encode data: $php_errormsg);
You can also compress and uncompress strings without the gzip-compatibility headers by using gzcompress()and gzuncompress().
Archived Comments
1. Thanks for this great tutorial... was looking for this kind of example.
View Tutorial By: Shashi at 2012-09-20 11:35:08
2. You should add the mime type as follows:
application/x-gzip
View Tutorial By: Anonymous at 2009-03-19 08:30:35
3. so if you then wanted to send this gzencoded data out the door via http - what headers would you use
View Tutorial By: Mike at 2009-03-18 12:12:28
Comment on this tutorial
- Data Science
- Android
- AJAX
- ASP.net
- C
- C++
- C#
- Cocoa
- Cloud Computing
- HTML5
- Java
- Javascript
- JSF
- JSP
- J2ME
- Java Beans
- EJB
- JDBC
- Linux
- Mac OS X
- iPhone
- MySQL
- Office 365
- Perl
- PHP
- Python
- Ruby
- VB.net
- Hibernate
- Struts
- SAP
- Trends
- Tech Reviews
- WebServices
- XML
- Certification
- Interview
categories
Related Tutorials
PHP convert string to lower case
PHP code to write to a CSV file for Microsoft Applications
PHP code to write to a CSV file from MySQL query
PHP code to import from CSV file to MySQL
Password must include both numeric and alphabetic characters - Magento
Error: Length parameter must be greater than 0
PHP file upload prompts authentication for anonymous users
PHP file upload with IIS on windows XP/2000 etc
Multiple File Upload in PHP using IFRAME
Resume or Pause File Uploads in PHP
Exception in module wampmanager.exe at 000F15A0 in Windows 8