zip_read()
La fonction zip_read() lit les entrées d'une archive zip en PHP. Découvrez sa syntaxe, des exemples et l'alternative moderne ZipArchive.
⚠️ Avertissement API héritée : La fonction
zip_read()et les fonctions zip procédurales associées ont été supprimées dans PHP 8.0. Elles nécessitent l'extension PECLext-zipet ne sont disponibles que dans PHP 7.4 et antérieur. Pour les applications PHP modernes, la classeZipArchiveest recommandée.
La fonction zip_read() lit l'entrée suivante (un fichier ou un répertoire) dans une archive zip ouverte. Elle fait partie de l'API zip procédurale héritée de PHP, où vous parcourez une archive entrée par entrée : ouvrez l'archive avec zip_open(), appelez zip_read() de manière répétée pour avancer dans les entrées, puis fermez-la avec zip_close().
Chaque appel réussi retourne une ressource d'entrée zip — un handle que vous passez aux fonctions zip_entry_* pour inspecter ou lire cette entrée. Lorsqu'il n'y a plus d'entrées, zip_read() retourne false, ce qui met fin à la boucle. En cas d'échec, elle retourne à la place un numéro de code d'erreur.
Syntaxe
La syntaxe de la fonction zip_read() est la suivante :
Syntaxe de la fonction zip_read() en PHP
resource|int|false zip_read(resource $zip)$zip est la ressource d'archive retournée par zip_open(). La valeur de retour est l'une des suivantes :
- une ressource d'entrée zip — il y a une entrée à traiter ;
false— la fin de l'archive a été atteinte ;- un code d'erreur entier — une erreur s'est produite lors de la lecture de l'archive.
Pourquoi itérer avec zip_read() ?
L'API procédurale est un curseur à avance uniquement : il n'existe pas d'appel « lister toutes les entrées ». Vous lisez une entrée, effectuez une action dessus (récupérer son nom et ses tailles, ou extraire son contenu), puis demandez la suivante. Cela maintient une faible utilisation de la mémoire car une seule entrée est en scope à la fois, mais cela signifie également que vous ne pouvez pas accéder directement à une entrée arbitraire — vous devez parcourir depuis le début.
Exemples d'utilisation
Exemple : Lister les entrées d'une archive zip
Cette boucle ouvre une archive et affiche les métadonnées de chaque entrée qu'elle contient :
Lecture des entrées d'une archive zip en PHP
$zip = zip_open("example.zip");
if (!is_resource($zip)) {
throw new RuntimeException("Failed to open zip archive (error code: $zip)");
}
while ($zip_entry = zip_read($zip)) {
echo "Name: " . zip_entry_name($zip_entry) . "\n";
echo "Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "Uncompressed Size: " . zip_entry_filesize($zip_entry) . "\n";
}
zip_close($zip);Le code ouvre example.zip avec zip_open(), puis boucle tant que zip_read() retourne des ressources d'entrée. Pour chaque entrée, il affiche le nom avec zip_entry_name(), la taille compressée avec zip_entry_compressedsize(), et la taille originale avec zip_entry_filesize(). Enfin, zip_close() libère l'archive.
Exemple : Lire le contenu d'une entrée
zip_read() vous positionne uniquement sur une entrée ; pour lire les octets réels, vous devez ouvrir l'entrée avec zip_entry_open() et récupérer les données avec zip_entry_read() :
$zip = zip_open("example.zip");
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
if (zip_entry_open($zip, $entry, "r")) {
$contents = zip_entry_read($entry, zip_entry_filesize($entry));
echo zip_entry_name($entry) . ":\n" . $contents . "\n";
zip_entry_close($entry);
}
}
zip_close($zip);
}Pièges courants
- Valeur de vérité de la boucle.
while ($entry = zip_read($zip))fonctionne car une ressource valide est vraie etfalsemet fin à la boucle. Mais un code d'erreur entier est également retourné en cas d'échec — vérifiezis_resource($zip)aprèszip_open()pour ne jamais itérer sur un handle défaillant. - Lecture uniquement vers l'avant. Il n'y a pas de rembobinage. Pour traiter à nouveau l'archive, rouvrez-la avec
zip_open(). - Supprimée dans PHP 8. Ces fonctions ont été supprimées dans PHP 8.0. Le code devant fonctionner avec PHP moderne devrait utiliser la classe orientée objet
ZipArchiveà la place.
Alternative moderne : ZipArchive
Sur PHP 8 et versions ultérieures, parcourez une archive avec la classe ZipArchive. Elle vous donne également un accès aléatoire par index, ce que zip_read() ne peut pas faire :
$zip = new ZipArchive();
if ($zip->open("example.zip") === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
echo "Name: {$stat['name']}\n";
echo "Compressed Size: {$stat['comp_size']}\n";
echo "Uncompressed Size: {$stat['size']}\n";
}
$zip->close();
}Consultez la vue d'ensemble de l'extension PHP Zip pour l'API complète de ZipArchive.
Conclusion
zip_read() fait avancer un curseur à avance uniquement à travers les entrées d'une archive zip ouverte avec zip_open(), retournant une ressource d'entrée zip à chaque fois et false à la fin. Elle est au cœur de la boucle de lecture zip procédurale héritée, associée aux fonctions zip_entry_* pour inspecter et extraire chaque entrée. Cette API ayant été supprimée dans PHP 8.0, préférez ZipArchive pour tout code ciblant les versions actuelles de PHP.