zip_read()
Die Funktion zip_read() liest Einträge aus einem geöffneten Zip-Archiv in PHP 7.4 und früher.
⚠️ Hinweis zur veralteten API: Die Funktion
zip_read()und verwandte prozedurale Zip-Funktionen wurden in PHP 8.0 entfernt. Sie erfordern die PECL-Erweiterungext-zipund sind nur in PHP 7.4 und früher verfügbar. Für moderne PHP-Anwendungen wird die KlasseZipArchiveempfohlen.
Die Funktion zip_read() liest den nächsten Eintrag (einen einzelnen Datei- oder Verzeichniseintrag) aus einem geöffneten Zip-Archiv. Sie ist Teil der veralteten prozeduralen Zip-API von PHP, bei der ein Archiv Eintrag für Eintrag durchlaufen wird: Öffnen Sie das Archiv mit zip_open(), rufen Sie zip_read() wiederholt auf, um durch die Einträge zu navigieren, und schließen Sie es anschließend mit zip_close().
Jeder erfolgreiche Aufruf gibt eine Zip-Entry-Ressource zurück – ein Handle, das Sie an die zip_entry_*-Funktionen übergeben, um den Eintrag zu untersuchen oder auszulesen. Wenn keine weiteren Einträge vorhanden sind, gibt zip_read() false zurück, was die Schleife beendet. Bei einem Fehler wird stattdessen ein Integer-Fehlercode zurückgegeben.
Syntax
Die Syntax der Funktion zip_read() lautet wie folgt:
Syntax der Funktion zip_read() in PHP
resource|int|false zip_read(resource $zip)$zip ist die Archiv-Ressource, die von zip_open() zurückgegeben wird. Der Rückgabewert ist einer der folgenden:
- eine Zip-Entry-Ressource — es gibt einen zu verarbeitenden Eintrag;
false— das Ende des Archivs wurde erreicht;- ein Integer-Fehlercode — beim Lesen des Archivs ist ein Fehler aufgetreten.
Warum mit zip_read() iterieren?
Die prozedurale API ist ein Vorwärtscursor: Es gibt keinen Aufruf zum „Auflisten aller Einträge". Sie lesen einen Eintrag, tun etwas damit (ermitteln Name und Größen oder extrahieren den Inhalt) und fragen dann den nächsten ab. Dies hält den Speicherbedarf niedrig, da jeweils nur ein Eintrag im Gültigkeitsbereich ist. Allerdings können Sie dadurch nicht zu einem beliebigen Eintrag springen – Sie müssen vom Anfang an durchlaufen.
Verwendungsbeispiele
Beispiel: Einträge eines Zip-Archivs auflisten
Diese Schleife öffnet ein Archiv und gibt Metadaten für jeden enthaltenen Eintrag aus:
Lesen der Einträge eines Zip-Archivs in 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);Der Code öffnet example.zip mit zip_open(), durchläuft dann die Schleife, solange zip_read() Entry-Ressourcen zurückgibt. Für jeden Eintrag gibt er den Namen mit zip_entry_name(), die komprimierte Größe mit zip_entry_compressedsize() und die ursprüngliche Größe mit zip_entry_filesize() aus. Abschließend gibt zip_close() das Archiv frei.
Beispiel: Inhalt eines Eintrags lesen
zip_read() positioniert Sie lediglich bei einem Eintrag; um die tatsächlichen Bytes zu lesen, müssen Sie den Eintrag mit zip_entry_open() öffnen und Daten mit zip_entry_read() abrufen:
$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);
}Häufige Fallstricke
- Wahrheitswert der Schleife.
while ($entry = zip_read($zip))funktioniert, weil eine gültige Ressource als truthy gilt undfalsedie Schleife beendet. Bei einem Fehler wird jedoch auch ein Integer-Fehlercode zurückgegeben – prüfen Sie mitis_resource($zip)nachzip_open(), damit Sie nie über ein fehlerhaftes Handle iterieren. - Nur Vorwärtslesen möglich. Es gibt keinen Rückspul-Mechanismus. Um das Archiv erneut zu verarbeiten, öffnen Sie es erneut mit
zip_open(). - Entfernt in PHP 8. Diese Funktionen wurden in PHP 8.0 gelöscht. Code, der auf modernem PHP laufen muss, sollte stattdessen die objektorientierte Klasse
ZipArchiveverwenden.
Moderne Alternative: ZipArchive
In PHP 8 und höher durchlaufen Sie ein Archiv mit der Klasse ZipArchive. Sie bietet auch wahlfreien Zugriff per Index, was zip_read() nicht kann:
$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();
}Weitere Informationen zur vollständigen ZipArchive-API finden Sie in der Übersicht zur PHP-Zip-Erweiterung.
Fazit
zip_read() bewegt einen Vorwärtscursor durch die Einträge eines mit zip_open() geöffneten Zip-Archivs, gibt dabei jeweils eine Zip-Entry-Ressource zurück und false am Ende. Sie ist das Herzstück der veralteten prozeduralen Zip-Leseschleife und wird zusammen mit den zip_entry_*-Funktionen zum Untersuchen und Extrahieren der Einträge verwendet. Da diese API in PHP 8.0 entfernt wurde, sollten Sie für Code, der auf aktuellen PHP-Versionen laufen soll, ZipArchive bevorzugen.