gzcompress
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
gzcompress — 文字列を圧縮する
説明
この関数は、ZLIB
データフォーマットを用いて
与えられた文字列を圧縮します。
ZLIB 圧縮アルゴリズムについての詳細は、 "» ZLIB Compressed Data Format Specification version 3.3" (RFC 1950) を参照ください。
注意:
これは、いくつかのヘッダデータを有する gzip 圧縮と同じでは ありません。 gzip圧縮については、gzencode()を参照ください。
パラメータ
data
-
圧縮するデータ
level
-
圧縮レベル。0 で圧縮無し、9 で最大限の圧縮を指定できます。
-1 を指定すると、zlib ライブラリのデフォルトを使います。デフォルトは 6 です。
encoding
-
定数
ZLIB_ENCODING_*
のいずれか。
戻り値
圧縮された文字列、もしくはエラーの場合 false
。
例
例1 gzcompress() の例
<?php
$compressed = gzcompress('Compress me', 9);
echo $compressed;
?>
参考
- gzdeflate() - 文字列を deflate 圧縮する
- gzinflate() - deflate圧縮された文字列を解凍する
- gzuncompress() - 圧縮された文字列を解凍する
- gzencode() - gzip 圧縮された文字列を作成する
+add a note
User Contributed Notes 2 notes
@boas.anthro.mnsu.edu ¶
24 years ago
No, it doesn't return gzip compressed data -- specifically, the CRC is messed up. However, after massaging the output a lot, I have come up with a solution. I also commented it a lot, pointing out odd things.
<?php
// Start the output buffer
ob_start();
ob_implicit_flush(0);
// Output stuff here...
// Get the contents of the output buffer
$contents = ob_get_contents();
ob_end_clean();
// Tell the browser that they are going to get gzip data
// Of course, you already checked if they support gzip or x-gzip
// and if they support x-gzip, you'd change the header to say
// x-gzip instead, right?
header("Content-Encoding: gzip");
// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);
// Compress the data
$contents = gzcompress($contents, 9);
// We can't just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely. There are four bytes at
// the end that are a CRC. Three are sent. The last one is
// left in limbo. Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client. I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data. (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won't keep loading indefinately.
//
// Strip off the old CRC (it's there, but it won't be displayed
// all the way -- very odd)
$contents = substr($contents, 0, strlen($contents) - 4);
// Show only the compressed data
echo $contents;
// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);
// Done. You can append further data by gzcompressing
// another string and reworking the CRC and Size stuff for
// it too. Repeat until done.
function gzip_PrintFourChars($Val)
{
for ($i = 0; $i < 4; $i ++)
{
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>
detain at interserver dot net ¶
7 years ago
gzipped strings include header/metadata you can use to determine if a string is gzipped or not , but since gzcompress does not include that I found myself needing a way to determine if a string was compressed or not. After some research (and then improvements) i came up with this:
/**
* determines if a string is a gzipped string supporting strings
* encoded with either gzencode or gzcompress
*
* @param string $string the string to check for compression
* @return bool whether or not the string was compmressed
*/
function is_gzipped($string) {
return mb_strpos($string, "\x1f\x8b\x08", 'US-ASCII') === 0 && @gzuncompress($string) !== FALSE;
}
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google