PHP 8.4.2 Released!

inflate_add

(PHP 7, PHP 8)

inflate_addDescomprime incrementalmente dados codificados

Descrição

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

Descomprime incrementalmente dados codificados no contexto expecificado em context.

Limitação: informações de cabeçalho de dados comprimidos GZIP não estão disponíveis.

Parâmetros

context

Um contexto criado com inflate_init().

data

Um pedaço de dados comprimidos.

flush_mode

Uma das constantes ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (padrão), ZLIB_FULL_FLUSH, ZLIB_FINISH. Normalmente, você desejará definir ZLIB_NO_FLUSH para maximizar a compressão e ZLIB_FINISH para terminar com o último pedaço de dados. Consulte o » manual do zlib para obter uma descrição detalhada dessas constantes.

Valor Retornado

Retorna um pedaço de dados descomprimidos, ou false em caso de falha.

Erros/Exceções

Se parâmetros inválidos forem fornecidos, ou se a descompressão dos dados requerer um dicionário predefinido e nenhum for especificado, o se o fluxo comprimido estiver corrompido ou tiver uma soma de verificação inválida, um erro de nível E_WARNING é gerado.

Registro de Alterações

Versão Descrição
8.0.0 context espera uma instância de InflateContext agora; anteriormente, era esperado um resource.

Veja Também

  • inflate_init() - Inicializa um contexto de descompressão incremental
adicione uma nota

Notas Enviadas por Usuários (em inglês) 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