Web студия "GrandView"
  Главная   Написать Контакты
   
   
О проекте
Руководство php
 

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);
?>

Список изменений

ВерсияОписание
4.2 добавлен аргумент level.



gzeof> <gzdeflate
Last updated: Sat, 27 Jan 2007
 
add a note add a note User Contributed Notes
gzencode
cbrunon at free dot fr
03-Aug-2006 06:52
Correct is:
<?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// Not GZIP format (See RFC 1952)
 
}
 
$method = ord(substr($data,2,1));  // Compression method
 
$flags  = ord(substr($data,3,1));  // Flags
 
if ($flags & 31 != $flags) {
   
// Reserved bits are set -- NOT ALLOWED by RFC 1952
   
return null;
  }
 
// NOTE: $mtime may be negative (PHP integer limitations)
 
$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) {
   
// 2-byte length prefixed EXTRA data in header
   
if ($len - $headerlen - 2 < 8) {
      return
false;    // Invalid format
   
}
   
$extralen = unpack("v",substr($data,8,2));
   
$extralen = $extralen[1];
    if (
$len - $headerlen - 2 - $extralen < 8) {
      return
false;    // Invalid format
   
}
   
$extra = substr($data,10,$extralen);
   
$headerlen += 2 + $extralen;
  }

 
$filenamelen = 0;
 
$filename = "";
  if (
$flags & 8) {
   
// C-style string file NAME data in header
   
if ($len - $headerlen - 1 < 8) {
      return
false;    // Invalid format
   
}
   
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
    if (
$filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
      return
false;    // Invalid format
   
}
   
$filename = substr($data,$headerlen,$filenamelen);
   
$headerlen += $filenamelen + 1;
  }

 
$commentlen = 0;
 
$comment = "";
  if (
$flags & 16) {
   
// C-style string COMMENT data in header
   
if ($len - $headerlen - 1 < 8) {
      return
false;    // Invalid format
   
}
   
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
    if (
$commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
      return
false;    // Invalid header format
   
}
   
$comment = substr($data,$headerlen,$commentlen);
   
$headerlen += $commentlen + 1;
  }

 
$headercrc = "";
  if (
$flags & 1) {
   
// 2-bytes (lowest order) of CRC32 on header present
   
if ($len - $headerlen - 2 < 8) {
      return
false;    // Invalid format
   
}
   
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
   
$headercrc = unpack("v", substr($data,$headerlen,2));
   
$headercrc = $headercrc[1];
    if (
$headercrc != $calccrc) {
      return
false;    // Bad header CRC
   
}
   
$headerlen += 2;
  }

 
// GZIP FOOTER - These be negative due to PHP's limitations
 
$datacrc = unpack("V",substr($data,-8,4));
 
$datacrc = $datacrc[1];
 
$isize = unpack("V",substr($data,-4));
 
$isize = $isize[1];

 
// Perform the decompression:
 
$bodylen = $len-$headerlen-8;
  if (
$bodylen < 1) {
   
// This should never happen - IMPLEMENTATION BUG!
   
return null;
  }
 
$body = substr($data,$headerlen,$bodylen);
 
$data = "";
  if (
$bodylen > 0) {
    switch (
$method) {
      case
8:
       
// Currently the only supported compression method:
       
$data = gzinflate($body);
        break;
      default:
       
// Unknown compression method
       
return false;
    }
  } else {
   
// I'm not sure if zero-byte body content is allowed.
    // Allow it for now...  Do nothing...
 
}

 
// Verifiy decompressed size and CRC32:
  // NOTE: This may fail with large data sizes depending on how
  //       PHP's integer limitations affect strlen() since $isize
  //       may be negative for large sizes.
 
if ($isize != strlen($data) || crc32($data) != $datacrc) {
   
// Bad format!  Length or CRC doesn't match!
   
return false;
  }
  return
$data;
}

?>
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 Pl
Новости
11 июля 2007
Сайт запущен
© 2007 info@grandviewstudio.com

Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/sites/grandviewstudiocom/www/65f67d67a94ad980786580ae69e11c07/sape.php on line 324

Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/sites/grandviewstudiocom/www/65f67d67a94ad980786580ae69e11c07/sape.php on line 330
Z058440144362 Z348613067571