inflate_add

(PHP 7, PHP 8)

inflate_addDécompresse des données de manière incrémentielle

Description

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

Décompresse de manière incrémentielle des données dans le context spécifié.

Limitation : les informations d'en-tête d'un flux compressé GZIP ne sont pas disponibles.

Liste de paramètres

context

Un contexte créé avec inflate_init().

data

Un morceau de données compressées.

flush_mode

Une des ZLIB_BLOCK, ZLIB_NO_FLUSH, ZLIB_PARTIAL_FLUSH, ZLIB_SYNC_FLUSH (par défaut), ZLIB_FULL_FLUSH, ZLIB_FINISH. Normalement vous voudrez définir ZLIB_NO_FLUSH pour maximiser la compression, et ZLIB_FINISH pour terminer avec le dernier morceau de données. Consultez le » manuel de zlib pour une description détaillée de ces constantes.

Valeurs de retour

Renvoie un morceau de données décompressées, ou false si une erreur survient.

Erreurs / Exceptions

Si des paramètres invalides sont donnés, décompresser les données nécessite un dictionnaire prédéfini, mais aucun n'est spécifié, le flux compressé est corrompu ou a un checksum invalide, une erreur de niveau E_WARNING est générée.

Historique

Version Description
8.0.0 context attend désormais une instance InflateContext avant une resource était attendue.

Voir aussi

  • inflate_init() - Initialise un contexte de décompressage incrémentiel
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