It's not obvious how to use this for _incremental_ decompression:
You feed _the compressed data_ into inflate_add() _in pieces_.
The internal state of the zlib context will make sure than you can split at any point and still get the correct total data out, as long as you keep reading until the end.
In this way, you don't have to hold the complete uncompressed data in memory at any one time (and don't have to materialize it either as a file for gzopen() etc.), allowing you to parse files much bigger than the available php memory limit.
<?php
/* a good step size depends on the input's level of compression,
unfortunately there's no obvious way to know that beforehand;
in doubt instead choose a rather small value and glue the pieces together,
until there's enough data for processing */
$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);
/* process fragment, potentially keep parts across iterations */
$outLen += strlen($dataFragment);
$status = inflate_get_status($inflCtxt);
$start += $step;
}
echo 'Input: ' . strlen($dataGz) . ' Bytes / Output: ' . $outLen . ' Bytes.';
?>
N.B.: Archives of extremely high compression will still bomb out with a stupid and unnecessary memory exhaustion, as it's not possible to define a limit in inflate_init() similar to gzuncompress().inflate_add
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
inflate_add
Референца за `function.inflate-add.php` со подобрена типографија и навигација.
inflate_add
Интерфејсот SessionUpdateTimestampHandlerInterface
inflate_add — Постепено декомпресирајте ги кодираните податоци
= NULL
Постепено ги декомпресира кодираните податоци во наведениот context.
Ограничување: информациите од заглавието на компресираните GZIP податоци не се достапни.
Параметри
context-
Контекст креиран со inflate_init().
data-
Парче компресирани податоци.
flush_mode-
Еден од
ZLIB_BLOCK,ZLIB_NO_FLUSH,ZLIB_PARTIAL_FLUSH,ZLIB_SYNC_FLUSH(стандардно),ZLIB_FULL_FLUSH,ZLIB_FINISH. Нормално, ќе сакате да го поставитеZLIB_NO_FLUSHза да ја максимизирате компресијата, иZLIB_FINISHза да завршите со последното парче податоци. Погледнете го » zlib прирачникот за детален опис на овие константи.
Вратени вредности
Враќа парче декомпресирани податоци, или false при неуспех.
Errors/Exceptions
Ако се дадени невалидни параметри, декомпресирањето на податоците бара претходно дефиниран речник, но не е специфициран, компресираниот поток е оштетен или има невалидна сума за проверка, грешка од ниво E_WARNING .
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 |
context очекува InflateContext
инстанца сега; претходно, а resource се очекуваше.
|
Види Исто така
- inflate_init() - Иницијализира контекст за инкрементално декомпресирање