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() 以進行 gzip 壓縮。

參數

data

要壓縮的資料。

level

壓縮等級。可以指定為 0 表示不壓縮,最高到 9 表示最大壓縮。

如果使用 -1,則會使用 zlib 程式庫的預設壓縮,也就是 6。

encoding

ZLIB_ENCODING_* 常數之一。

傳回值

壓縮後的字串,如果發生錯誤則傳回 false

範例

範例 1 gzcompress() 範例

<?php
$compressed
= gzcompress('壓縮我', 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 檔案的標頭
// 感謝 ck@medienkombinat.de!
// 只顯示一次
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";

// 計算原始檔案的大小和 CRC,以便稍後使用
$Size = strlen($contents);
$Crc = crc32($contents);

// 壓縮資料
$contents = gzcompress($contents, 9);

// 我們不能直接在這裡輸出,因為 CRC 錯亂了。
// 如果我在此時嘗試「echo $contents」,壓縮
// 資料會被傳送,但不完全。末尾有四個位元組
// 是 CRC。傳送了三個。最後一個位元組
// 被留在 limbo 中。此外,如果我們「echo $contents」,則
// 我們 echo 的下一個位元組將不會傳送給用戶端。我不確定
// 這是不是 4.0.2 中的錯誤,但避免
// 這個問題的最佳方法是將正確的 CRC 放在壓縮
// 資料的末尾。(gzcompress 產生的 CRC 看起來非常錯誤。)
// 這將阻止 Opera 崩潰,gunzip 將會運作,而且
// 其他瀏覽器不會一直載入。
//
// 移除舊的 CRC(它在那裡,但不會完全顯示 -- 非常奇怪)
$contents = substr($contents, 0, strlen($contents) - 4);

// 只顯示壓縮資料
echo $contents;

// 輸出 CRC,然後輸出原始資料的大小
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);


// 完成。您可以使用 gzcompress 附加更多資料
// 另一個字串,並為它重新計算 CRC 和大小。
// 重複直到完成。


function gzip_PrintFourChars($Val)
{
for (
$i = 0; $i < 4; $i ++)
{
echo
chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>
detain at interserver dot net
7 年前
gzipped 字串包含可用於判斷字串是否為 gzipped 的標頭/中繼資料,但由於 gzcompress 不包含該標頭/中繼資料,我發現自己需要一種方法來判斷字串是否已壓縮。經過一些研究(然後是改進),我想出了這個

/**
* 判斷字串是否為 gzipped 字串,支援字串
* 使用 gzencode 或 gzcompress 編碼
*
* @param string $string 要檢查是否壓縮的字串
* @return bool 字串是否已壓縮
*/
function is_gzipped($string) {
return mb_strpos($string, "\x1f\x8b\x08", 'US-ASCII') === 0 && @gzuncompress($string) !== FALSE;
}
To Top