18.25. Reading and Writing Compressed Files
Problem
You want to read or write compressed files.
Solution
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");Discussion
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 ...