PHP Conference Japan 2024

inflate_add

(PHP 7, PHP 8)

inflate_add遞增式解壓縮編碼資料

說明

inflate_add(InflateContext $context, 字串 $data, int $flush_mode = ZLIB_SYNC_FLUSH): 字串|false

在指定的 context 中遞增式解壓縮編碼資料。

限制:GZIP 壓縮資料中的標頭資訊無法使用。

參數

context

使用 inflate_init() 建立的上下文。

data

一塊壓縮資料。

flush_mode

參數 $flags 可以是以下其中之一:ZLIB_BLOCKZLIB_NO_FLUSHZLIB_PARTIAL_FLUSHZLIB_SYNC_FLUSH(預設值)、ZLIB_FULL_FLUSHZLIB_FINISH。通常,您會希望設定 ZLIB_NO_FLUSH 以最大化壓縮,並使用 ZLIB_FINISH 來終止最後一塊資料的處理。有關這些常數的詳細說明,請參閱 » zlib 手冊

返回值

返回一塊未壓縮的數據,如果失敗則返回 false

錯誤/異常

如果給定無效參數、解壓縮數據需要預設字典但未指定、壓縮串流損壞或具有無效的校驗和,則會產生等級為 E_WARNING 的錯誤。

更新日誌

版本 說明
8.0.0 context 參數現在需要一個 InflateContext 實例;以前,需要一個 資源

另請參閱

新增註釋

使用者貢獻的註釋 1 則註釋

burp at -only-in-German-fuerspam dot de
1 年前
如何使用它進行_增量_解壓縮並不顯而易見
您將_壓縮數據_ _分段_ 提供給 inflate_add()。
zlib 上下文的內部狀態將確保您可以從任何點分割,並且仍然獲得正確的完整數據,只要您持續讀取到結束為止。

通過這種方式,您不必在任何時候將完整的未壓縮數據保存在記憶體中(也不必將其具體化為 gzopen() 等的檔案),從而允許您解析比可用 php 記憶體限制大得多的檔案。

<?php
/* 適當的步長取決於輸入的壓縮程度,
可惜事先無法明顯得知;
如有疑問,請選擇較小的值並將片段拼接在一起,
直到有足夠的數據可供處理 */
$step = 500000;

$dataGz = load_gzip_compressed_data_to_string();

$start = 0;
$outLen = 0;
$ctxt = inflate_init(ZLIB_ENCODING_GZIP);
$status = inflate_get_status($inflCtxt);

while(
$status == ZLIB_OK) {
$split = substr($dataGz, $start, $step);
$dataFragment = inflate_add($inflCtxt, $split);
/* 處理片段,可能需要跨迭代保留部分內容 */
$outLen += strlen($dataFragment);
$status = inflate_get_status($inflCtxt);
$start += $step;
}
echo
'輸入:' . strlen($dataGz) . ' 位元組 / 輸出:' . $outLen . ' 位元組。';
?>

注意:極高壓縮的檔案仍會因記憶體耗盡而炸掉,且錯誤訊息既愚蠢又不必要,因為無法在 inflate_init() 中定義類似 gzuncompress() 的限制。
To Top