PHP Conference Japan 2024

gzcompress

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

gzcompress压缩字符串

描述

gzcompress(字符串 $data, 整数 $level = -1, 整数 $encoding = ZLIB_ENCODING_DEFLATE): 字符串|false

此函数使用 ZLIB 数据格式压缩给定的字符串。

有关 ZLIB 压缩算法的详细信息,请参阅文档“» ZLIB 压缩数据格式规范版本 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;
?>

参见

添加注释

用户贡献的注释 2 个注释

@boas.anthro.mnsu.edu
24 年前
不,它不会返回 gzip 压缩的数据——具体来说,CRC 会出错。但是,经过大量的修改输出,我得出了一个解决方案。我还对其进行了大量的注释,指出了奇怪的地方。

<?php
// 开始输出缓冲区
ob_start();
ob_implicit_flush(0);

// 在此处输出内容...

// 获取输出缓冲区的内容
$contents = ob_get_contents();
ob_end_clean();

// 告诉浏览器他们将获得 gzip 数据
// 当然,您已经检查了他们是否支持 gzip 或 x-gzip
// 并且如果他们支持 x-gzip,您会将标题更改为
// x-gzip,对吧?
header("Content-Encoding: gzip");

// 显示 gzip 文件的头部
// 感谢 [email protected]!
// 只显示一次
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";

// 找出原始的大小和 CRC 以备后用
$Size = strlen($contents);
$Crc = crc32($contents);

// 压缩数据
$contents = gzcompress($contents, 9);

// 我们不能在这里输出它,因为 CRC 出错了。
// 如果我尝试在此处“echo $contents”,则会发送压缩
// 数据,但并不完整。最后四个字节是
// CRC。发送了三个。最后一个
// 处于悬而未决的状态。此外,如果我们“echo $contents”,则下一个
// 我们回显的字节将不会发送到客户端。我不确定
// 这是 4.0.2 中的错误还是不是,但避免的最佳方法
// 这是在压缩数据末尾放置正确的 CRC
// 数据。(由 gzcompress 生成的看起来非常错误。)
// 这将阻止 Opera 崩溃,gunzip 将起作用,并且
// 其他浏览器不会无限期地加载。
//
// 去掉旧的 CRC(它在那里,但不会显示
// 完全——非常奇怪)
$contents = substr($contents, 0, strlen($contents) - 4);

// 只显示压缩数据
echo $contents;

// 输出 CRC,然后输出原始的大小
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);


// 完成。您可以通过 gzcompress 追加更多数据
// 另一个字符串并重新修改 CRC 和 Size 内容
// 它也一样。重复直到完成。


function gzip_PrintFourChars($Val)
{
for (
$i = 0; $i < 4; $i ++)
{
echo
chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>
detain at interserver dot net
7 年前
gzip 压缩的字符串包含标题/元数据,您可以使用它来确定字符串是否为 gzip 压缩,但由于 gzcompress 不包含该数据,我发现自己需要一种方法来确定字符串是否已压缩。经过一些研究(然后是改进),我想出了这个方法

/**
* 确定字符串是否为 gzip 压缩的字符串,支持字符串
* 使用 gzencode 或 gzcompress 编码
*
* @param 字符串 $string 要检查是否压缩的字符串
* @return 布尔值 字符串是否已压缩
*/
function is_gzipped($string) {
return mb_strpos($string, "\x1f\x8b\x08", 'US-ASCII') === 0 && @gzuncompress($string) !== FALSE;
}
To Top