inflate_add

(PHP 7, PHP 8)

inflate_addDescomprime datos de manera incremental

Descripción

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

Descomprime de manera incremental los datos en el context especificado.

Limitación: la información del encabezado de un flujo comprimido GZIP no está disponible.

Parámetros

context

Un contexto creado con inflate_init().

data

Un fragmento de datos comprimidos.

flush_mode

Una de las ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (por defecto), ZLIB_FULL_FLUSH, ZLIB_FINISH. Normalmente querrá establecer ZLIB_NO_FLUSH para maximizar la compresión, y ZLIB_FINISH para terminar con el último fragmento de datos. Consulte el » manual de zlib para una descripción detallada de estas constantes.

Valores devueltos

Devuelve un fragmento de datos descomprimidos, o false en caso de error.

Errores/Excepciones

Si se proporcionan parámetros inválidos, descomprimir los datos requiere un diccionario predefinido, pero ninguno está especificado, el flujo comprimido está corrupto o tiene un checksum inválido, se genera un error de nivel E_WARNING.

Historial de cambios

Versión Descripción
8.0.0 context ahora espera una instancia InflateContext antes se esperaba un resource.

Ver también

  • inflate_init() - Inicializa un contexto de descompresión incremental
add a note

User Contributed Notes 1 note

up
0
burp at -only-in-German-fuerspam dot de
1 year ago
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().
To Top