|
 |
gzencode (PHP 4 >= 4.0.4, PHP 5) gzencode -- Сжимает строку в формате gzip Описаниеstring gzencode ( string data [, int level [, int encoding_mode]] )
Возвращает сжатую версию данных data, аналогично выводу программы gzip.
Для подробностей по формату GZIP, см. GZIP file format specification
4.3 (RFC 1952).
Список параметров
- data
Данные для сжатия.
- level
Уровень сжатия. 0 - без сжатия, 9 - максимальное сжатие. Если не указано,
будет использоваться уровень сжатия по умолчанию библиотеки zlib.
- encoding_mode
Режим сжатия, может быть FORCE_GZIP (по умолчанию) или FORCE_DEFLATE.
В случае FORCE_DEFLATE, будет возвращена строка, сжатая по алгоритму zlib deflate (с заголовками zlib) после заголовка файла gzip, но без проверочной суммы crc32 в конце.
Возвращаемые значения
Сжатая строка или FALSE в случае ошибки.
Примеры
Возвращаемые данные будут содержать соответствующие заголовки и структуры данных как в обычном .gz-файле, например:
Пример 1. CСоздание файла gzip
<?php
$data = implode("", file("bigfile.txt"));
$gzdata = gzencode($data, 9);
$fp = fopen("bigfile.txt.gz", "w");
fwrite($fp, $gzdata);
fclose($fp);
?>
|
|
gzencode
StoneCypher ( http://sc.tri-bit.com/ )
25-Feb-2005 12:19
The example in the notes would be more obvious written as:
<?php
file_put_contents( 'output.gz', gzencode( file_get_contents('input.file', 9) ) );
?>
Aaron G.
06-Aug-2004 06:29
<?php
function gzdecode($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
return null; }
$method = ord(substr($data,2,1)); $flags = ord(substr($data,3,1)); if ($flags & 31 != $flags) {
return null;
}
$mtime = unpack("V", substr($data,4,4));
$mtime = $mtime[1];
$xfl = substr($data,8,1);
$os = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra = "";
if ($flags & 4) {
if ($len - $headerlen - 2 < 8) {
return false; }
$extralen = unpack("v",substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
return false; }
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
if ($len - $headerlen - 1 < 8) {
return false; }
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false; }
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
if ($len - $headerlen - 1 < 8) {
return false; }
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false; }
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
if ($len - $headerlen - 2 < 8) {
return false; }
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false; }
$headerlen += 2;
}
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
$data = gzinflate($body);
break;
default:
return false;
}
} else {
}
if ($isize != strlen($data) || crc32($data) != $datacrc) {
return false;
}
return $data;
}
?>
sjab-x at bergenbosgroep dot nl
26-Dec-2002 06:06
If you want a binary proof function use fread instead of implode.
function create_gzip_file($src_file, $dest_file) {
$fd = fopen ($src_file, "r");
$data = fread ($fd, filesize ($src_file));
fclose ($fd);
$gz_data = gzencode($data);
$fp = fopen($dest_file, "w+");
fwrite($fp, $gz_data);
fclose($fp);
}
This works fine for me :)
tychay at alumni dot caltech dot edu
03-Apr-2002 02:53
The 10 byte string in gzencode is the standard gzip header. The first two bytes (1f 8b) define the return as a gzip file, the third byte (08) means that the body is compressed using the "deflate" algorithm. The rest is padding (00)'s.
Technically, I believe one should check if the third byte is hex 08 and if so strip off the first ten bytes and last four bytes and run inflate on it. The last four bytes are file size and checksum bits.
In practice, you can get away with just stripping the first 10 bytes and running inflate on it.
Hope this helps,
terry
henryk at ploetzli dot ch
14-Feb-2002 06:28
Well, I was looking for a gzdecode too and didn't consider the temporary file example above to be very elegant.
However, as is noted in the very first comment: gzencode() only adds a 10 byte header.
I don't quite know what this header is supposed to be used for, but gzinflate() certainly doesn't like it, so I stripped it off:
function my_gzdecode($string) {
$string = substr($string, 10);
return gzinflate($string);
}
That's useful to read HTTP-Connections that were compressed by mod_gzip.
--
Henryk Pltz
Gre aus Berlin
g dot benoit at free dot fr
12-Feb-2002 05:21
function create_gzip_file($src_file, $dest_file)
{
$data = implode("", file($src_file));
$gz_data = gzencode($data);
$fp = fopen($dest_file, "w+");
fwrite($fp, $gz_data);
fclose($fp);
}
create_gzip_file("text.txt", "test.txt.gz");
mm.. oops? - amendum (yes, tested hehe.)
09-Sep-2001 12:14
function alt_gzdecode($str) {
// seed with microseconds since last "whole" second
mt_srand((float)microtime()*1000000);
$eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";
$fd=fopen($eh,"w");
fwrite($fd,$str);
fclose($fd);
unset($str);
$fd = gzopen ($eh, "r");
while (1==1) {
$s=gzread($fd,10240);
if ("$s" == "") {
break;
}
$str=$str . $s;
}
unlink($eh);
return $str;
}
< supaplex %at% pcbkits %d0t% c0m >
08-Sep-2001 11:48
I was almost discouraged when I didn't find a gzdecode() function! However, fear not, for I'll contribute my work... :)
function alt_gzdecode($str) {
// seed with microseconds since last "whole" second.
mt_srand((float)microtime()*1000000);
$eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";
$fd=fopen($eh,"w");
fwrite($fd,$str);
fclose($fd);
$fd = gzopen ($eh, "r");
$str=gzpassthru($fd);
unlink($eh);
return $str;
}
It's only ugly point is that it does not check to see if the file already exists. You may also have to adjust reference names like $str and $fd if they stomp on your code. (Sorry, but this is all you get atm! ;} ) If your conserned about a race condition, cry for a internal gzdecode() function that actualy functions...
I spent about 3 hours straight debugging this problem. I know the input data was valid, becuase I validated it with MD5() to compare to the md5's I had made of the input data before hand. I'm not sure whats up with gzuncompress or gzinflate, but this works in its place . . .
Enjoy!
| |