Signatur
Beschreibung
zip_open() öffnet ein ZIP-Archiv unter dem angegebenen Dateipfad und gibt im Erfolgsfall eine Ressource zurück, die als Handle für nachfolgende Zip-Funktionen wie zip_read() und zip_entry_open() verwendet wird. Die Funktion gehört zur älteren, prozeduralen ZIP-API von PHP.
Schlägt das Öffnen fehl, liefert die Funktion einen Integer-Fehlercode statt false – ein häufiger Stolperstein. Typische Fehlercodes sind z. B. ER_NOENT (Datei nicht gefunden) oder ER_NOZIP (keine gültige ZIP-Datei). Um festzustellen, ob ein Fehler aufgetreten ist, sollte daher mit is_resource() geprüft werden.
Für neue Projekte empfiehlt sich die objektorientierte ZipArchive-Klasse, da sie robuster, vollständiger und besser dokumentiert ist. zip_open() gilt zwar nicht offiziell als veraltet, wird aber kaum noch weiterentwickelt.
Das zurückgegebene Handle muss nach der Verwendung mit zip_close() geschlossen werden, um Ressourcen freizugeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Absoluter oder relativer Pfad zur ZIP-Datei, die geöffnet werden soll. |
Rückgabewert
false wird nur in seltenen Ausnahmefällen zurückgegeben. Mit is_resource() sollte geprüft werden, ob das Öffnen erfolgreich war.Beispiele
ZIP-Archiv öffnen und alle Einträge auflisten
<?php
$zip = zip_open('/pfad/zur/archiv.zip');
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
echo 'Eintrag: ' . zip_entry_name($entry) . PHP_EOL;
}
zip_close($zip);
} else {
echo 'Fehler beim Öffnen des Archivs. Fehlercode: ' . $zip . PHP_EOL;
}
?>
Inhalt einer Datei aus dem Archiv lesen
<?php
$zip = zip_open('/pfad/zur/archiv.zip');
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
if ($name === 'readme.txt') {
if (zip_entry_open($zip, $entry, 'r')) {
$inhalt = zip_entry_read($entry, zip_entry_filesize($entry));
echo $inhalt;
zip_entry_close($entry);
}
}
}
zip_close($zip);
} else {
echo 'ZIP-Datei konnte nicht geöffnet werden. Code: ' . $zip;
}
?>
// Wichtig · Fallstricke
Achtung: Im Fehlerfall gibt zip_open() einen Integer-Fehlercode zurück und nicht false. Ein einfaches if (!$zip) funktioniert daher nicht korrekt, da ein Integer > 0 als true ausgewertet wird. Verwende immer is_resource($zip) zur Überprüfung.
Für neue Projekte sollte statt dieser prozeduralen API die Klasse ZipArchive verwendet werden, die deutlich mehr Funktionalität bietet, aktiv gepflegt wird und eine konsistentere Fehlerbehandlung ermöglicht.
Die Funktion erfordert, dass PHP mit ZIP-Unterstützung kompiliert wurde (in der Regel über die zip-Extension, die ab PHP 7.4 standardmäßig gebündelt ist).