zip_entry_read()
La fonction zip_entry_read() est une fonction intégrée de PHP permettant de lire le contenu d'un fichier dans une archive zip.
La fonction zip_entry_read() était une fonction PHP intégrée permettant de lire le contenu d'un fichier unique (une entrée) à l'intérieur d'une archive zip ouverte, un bloc d'octets à la fois. Elle retournait les données lues sous forme de chaîne.
Important : toute la famille procédurale zip_entry_* — y compris zip_entry_read() — a été dépréciée en PHP 7.4 et supprimée en PHP 8.0. Il n'existe pas de remplacement direct ; à la place, le PHP moderne lit les entrées zip via la classe orientée objet ZipArchive. Cette page documente la fonction héritée à titre de référence, puis présente l'approche ZipArchive à utiliser aujourd'hui. Pour travailler avec des fichiers zip, l'extension zip doit être activée dans votre installation PHP.
Syntaxe (héritée)
string zip_entry_read(resource $zip_entry, int $length = 1024)| Paramètre | Description |
|---|---|
$zip_entry | Le descripteur d'entrée retourné par zip_entry_open() après que l'archive a été ouverte avec zip_open() et qu'une entrée a été obtenue via zip_read(). |
$length | Optionnel. Le nombre d'octets à lire. Comme les entrées zip sont stockées compressées, il s'agit du nombre d'octets décompressés retournés. Par défaut : 1024. |
Valeur de retour : le contenu lu sous forme de chaîne, ou false en cas d'échec. Comme pour la lecture d'un fichier, les appels successifs avancent dans l'entrée jusqu'à son épuisement.
Lecture d'une entrée zip avec ZipArchive (moderne)
Le remplacement le plus simple est ZipArchive::getFromName(), qui retourne l'intégralité du contenu décompressé d'une entrée à partir de son nom de fichier — sans boucle manuelle d'ouverture/lecture/fermeture par entrée.
Lecture d'un fichier depuis une archive zip en PHP
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$contents = $zip->getFromName('readme.txt');
$zip->close();
if ($contents !== false) {
echo $contents;
} else {
echo "Entry not found in archive.";
}
} else {
echo "Failed to open archive.";
}Ici, open() retourne true en cas de succès (il peut également retourner un code d'erreur, donc comparez strictement avec === true). getFromName() décompresse et retourne l'entrée entière en un seul appel. Utilisez getFromIndex($i) à la place si vous souhaitez accéder à l'entrée à une position numérique plutôt que par son nom.
Parcourir toutes les entrées
Une tâche courante consiste à lire tous les fichiers d'une archive. numFiles donne le nombre d'entrées et statIndex() fournit les métadonnées de chaque entrée :
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$data = $zip->getFromIndex($i);
echo $name . " (" . strlen($data) . " bytes)\n";
}
$zip->close();
}Diffusion en flux des grandes entrées
getFromName() charge l'intégralité de l'entrée en mémoire. Pour un fichier volumineux, ouvrez l'entrée comme un flux et lisez-la par blocs — c'est le véritable équivalent moderne du comportement par blocs de zip_entry_read() :
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$stream = $zip->getStream('big-log.txt');
if ($stream) {
while (!feof($stream)) {
$chunk = fread($stream, 8192); // read 8 KB at a time
echo $chunk;
}
fclose($stream);
}
$zip->close();
}Le flux retourné est une ressource de flux PHP ordinaire, de sorte que les fonctions habituelles comme fread() et feof() fonctionnent directement dessus.
Dans quels cas l'utiliser ?
- Lecture de fichiers de configuration ou de modèles livrés dans un
.zipsans les extraire sur le disque. - Inspection d'un fichier uploadé (par exemple, un
.docxou.xlsx, qui sont des conteneurs zip) entrée par entrée. - Traitement de journaux archivés volumineux par diffusion en flux plutôt que de tout décompresser d'abord.
Si vous n'avez besoin que des octets d'un seul fichier et peu importe qu'il se trouve dans un zip, l'extraire d'abord et utiliser file_get_contents() est également une option valable.
Conclusion
zip_entry_read() appartenait à l'ancienne API zip procédurale de PHP, dépréciée en 7.4 et supprimée en 8.0. Sur toute version PHP supportée, lisez les entrées zip avec la classe ZipArchive : utilisez getFromName() / getFromIndex() pour les entrées complètes, parcourez-les avec numFiles, et utilisez getStream() avec fread() lorsqu'une entrée est trop volumineuse pour être maintenue en mémoire en une seule fois.