CakeFest 2024: The Official CakePHP Conference

gzencode

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gzencodegzip 圧縮された文字列を作成する

説明

gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string|false

この関数は、入力 datagzip プログラムの出力と互換性のある形式で圧縮 して返します。

GZIPファイルフォーマットに関する詳細な情報については、次のドキュ メントを参照ください。 » GZIP file format specification version 4.3 (RFC 1952)

パラメータ

data

エンコードするデータを指定します

level

圧縮レベルを指定します。 圧縮をしない場合に 0、最大限の圧縮を行う場合に9を指定可能です。 指定されない場合のデフォルト圧縮レベルは、 zlib ライブラリのデフォルト圧縮レベルになります。

encoding

エンコーディングモードを指定します。 FORCE_GZIP (デフォルト) もしくは FORCE_DEFLATE を指定可能です。

FORCE_DEFLATE は RFC 1950 準拠の出力を生成します。 これは、zlib ヘッダ、圧縮したデータ、 そして Adler チェックサムで構成されます。

戻り値

エンコードされた文字列、もしくはエラー発生時に false

結果データは標準的な .gz ファイルを構成するための適当なヘッダとデータ構造を含みます。

例1 gzip ファイルの生成

<?php
$data
= file_get_contents("bigfile.txt");
$gzdata = gzencode($data, 9);
file_put_contents("bigfile.txt.gz", $gzdata);
?>

参考

add a note

User Contributed Notes 11 notes

up
10
Sam Dowling
12 years ago
this is a benchmark test of gzencode (.txt file)
----------------------------------------------
original file size = 3.29 MB (3,459,978 bytes)
compress lvl 1 = 1.09 MB (1,144,006 bytes)
compress lvl 2 = 1.06 MB (1,119,518 bytes)
compress lvl 3 = 1.03 MB (1,085,567 bytes)
compress lvl 4 = 953 KB (976,538 bytes)
compress lvl 5 = 909 KB (931,486 bytes)
compress lvl 6 = 910 KB (932,516 bytes)
compress lvl 7 = 910 KB (932,608 bytes)
compress lvl 8 = 910 KB (932,646 bytes)
compress lvl 9 = 910 KB (932,652 bytes)
----------------------------------------------
up
7
getmequick at dot com
15 years ago
NOTE:

doing like this and so on

<?php
file_put_contents
('output.gz', gzencode( file_get_contents('input.file'),9));
?>

(complete file reading)

may cause memory overflow (Fatal error: Allowed memory size of ..), so it's better to read by parts/bytes.
up
6
geompse at gmail dot com
12 years ago
Had some trouble finding the correct way to send a Content-Length header with HTTP compression.
The pitch is to use gzencode (not gzdeflaten not gzcompress).

<?php

// disable ZLIB ouput compression
ini_set('zlib.output_compression','Off');

// compress data
$gzipoutput = gzencode($output,6);

// various headers, those with # are mandatory
header('Content-Type: application/x-download');
header('Content-Encoding: gzip'); #
header('Content-Length: '.strlen($gzipoutput)); #
header('Content-Disposition: attachment; filename="myfile.name"');
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Pragma: no-cache');

// output data
echo $gzipoutput;

?>
up
0
gazj at nukemodified dot com
15 years ago
here is my clean up of supaplex %at% pcbkits %d0t% c0m
submission above.

function alt_gzdecode($gzdatadecode) {
// seed with microseconds since last "whole" second.
mt_srand((float)microtime()*1000000);
$eh="/tmp/php-" . md5(mt_rand(0,mt_getrandmax())) . ".gz";
if(file_exists($eh)){

$gzf=fopen($eh,"w");
fwrite($gzf,$gzdatadecode);
fclose($gzf);

$gzf = gzopen ($eh, "r");
$gzdatadecode=gzpassthru($gzf);
unlink($eh);

return $gzdatadecode;
}else{
return 'File '.$eh.' was not found.';
}
}
up
0
tychay at alumni dot caltech dot edu
21 years ago
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
up
-1
pang dot lab at gmail dot com
3 years ago
* Compressing file

function compressFile(string $filePath): ?string
{
$compressedFile = $filePath.".gz";
$data = implode(",", file($filePath));
$gzdata = gzencode($data, 9);
$fp = fopen($compressedFile, "w");
$successWrite = fwrite($fp, $gzdata);
fclose($fp);
if($successWrite === false) {
return null;
}

return $compressedFile;
}
up
-4
katzlbtjunk at hotmail dot com
15 years ago
Aaron G. 07-Aug-2004 03:29 posted the excellent function gzdecode() (SEE BELOW)
BUGFIX: Change: if($flags & 1) to ... if($flags & 2)

Unfortunately the function gzencode() does NOT append a CRC! So the previous version worked with output of gzencode but not with output of the gzip program itself.
up
-4
henryk at ploetzli dot ch
22 years ago
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?tz
Gr??e aus Berlin
up
-5
< supaplex %at% pcbkits %d0t% c0m >
22 years ago
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!
up
-6
cbrunon at free dot fr
17 years ago
Correct is:
<?php
file_put_contents
('output.gz', gzencode( file_get_contents('input.file'),9));
?>
up
-7
mm.. oops? - amendum (yes, tested hehe.)
22 years ago
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;
}
To Top