Start · Sprachen · PHP · Referenz · zip_open

zip_open

Funktion

Öffnet ein ZIP-Archiv und gibt eine Ressource zurück, mit der auf dessen Einträge zugegriffen werden kann.

seit PHP 4.1.0 Kategorie: io

Signatur

zip_open(string $filename): resource|int|false

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

Typ
resource|int|false
Beschreibung
Im Erfolgsfall eine ZIP-Ressource. Bei einem Fehler wird ein Integer-Fehlercode zurückgegeben (z. B. wenn die Datei nicht existiert oder kein gültiges ZIP-Archiv ist). 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;
}
?>
Eintrag: bilder/ Eintrag: bilder/foto.jpg Eintrag: readme.txt

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;
}
?>
Willkommen in diesem Archiv!

// 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).