Start · Sprachen · PHP · Referenz · zip_entry_open

zip_entry_open

Funktion

Öffnet einen ZIP-Verzeichniseintrag zum Lesen innerhalb eines mit <code>zip_open()</code> geöffneten Archivs.

seit PHP 4.1.0 Kategorie: io

Signatur

zip_entry_open(resource $zip, resource $zip_entry, string $mode = "rb"): bool

Beschreibung

zip_entry_open() öffnet einen einzelnen Eintrag (Datei) innerhalb eines ZIP-Archivs für den Lesezugriff. Der Eintrag wird durch das Ressource-Handle $zip_entry repräsentiert, das zuvor mit zip_read() ermittelt wurde. Erst nach dem Öffnen kann der Inhalt mit zip_entry_read() ausgelesen werden.

Der Parameter $mode akzeptiert dieselben Werte wie fopen(), in der Praxis wird jedoch üblicherweise "rb" (Read-Binary) verwendet. Da ZIP-Archive grundsätzlich binäre Daten enthalten können, sollte immer der binäre Modus genutzt werden.

Diese Funktion gehört zur älteren, prozeduralen ZIP-API von PHP. Für neue Projekte wird die Klasse ZipArchive empfohlen, die einen objektorientierteren und komfortableren Zugriff bietet. Die prozedurale ZIP-API gilt als veraltet und kann in zukünftigen PHP-Versionen entfernt werden.

Nach der Verarbeitung des Eintrags sollte er mit zip_entry_close() wieder geschlossen werden, um Ressourcen freizugeben.

Parameter

Name Typ Default Beschreibung
$zip Pflicht resource Eine gültige ZIP-Ressource, die zuvor mit zip_open() geöffnet wurde.
$zip_entry Pflicht resource Ein ZIP-Eintrags-Handle, das mit zip_read() aus dem Archiv gelesen wurde.
$mode string rb Der Öffnungsmodus, analog zu fopen(). In der Praxis sollte immer "rb" (Read-Binary) verwendet werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Eintrag erfolgreich geöffnet wurde, andernfalls false.

Beispiele

Alle Dateien eines ZIP-Archivs auslesen und ausgeben

<?php
$zip = zip_open('/pfad/zum/archiv.zip');

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        echo "Datei: " . $name . "\n";

        if (zip_entry_open($zip, $entry, 'rb')) {
            $size = zip_entry_filesize($entry);
            $inhalt = zip_entry_read($entry, $size);
            echo "Größe: " . strlen($inhalt) . " Bytes\n";
            zip_entry_close($entry);
        } else {
            echo "Konnte Eintrag nicht öffnen.\n";
        }
    }
    zip_close($zip);
} else {
    echo "Archiv konnte nicht geöffnet werden. Fehlercode: " . $zip . "\n";
}
?>
Datei: readme.txt Größe: 1024 Bytes Datei: bild.png Größe: 20480 Bytes

Inhalt einer bestimmten Datei aus einem ZIP extrahieren

<?php
$zip = zip_open('/pfad/zum/archiv.zip');
$gesuchterName = 'config.json';
$gefunden = false;

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        if (zip_entry_name($entry) === $gesuchterName) {
            if (zip_entry_open($zip, $entry, 'rb')) {
                $inhalt = zip_entry_read($entry, zip_entry_filesize($entry));
                $daten = json_decode($inhalt, true);
                var_dump($daten);
                zip_entry_close($entry);
                $gefunden = true;
            }
            break;
        }
    }
    zip_close($zip);
}

if (!$gefunden) {
    echo "Datei '{$gesuchterName}' nicht im Archiv gefunden.\n";
}
?>
array(3) { ["version"] => string(5) "1.0.0" ... }

// Wichtig · Fallstricke

Deprecation-Hinweis: Die prozedurale ZIP-Erweiterung (zip_open, zip_read, zip_entry_open usw.) gilt als veraltet. Ab PHP 8.0 wird die Verwendung der Klasse ZipArchive ausdrücklich empfohlen. In zukünftigen PHP-Versionen könnten diese Funktionen entfernt werden.

Ressourcen-Management: Jeder mit zip_entry_open() geöffnete Eintrag sollte nach der Verwendung mit zip_entry_close() geschlossen werden, um Speicher und Systemressourcen freizugeben.

Sicherheit: Beim Entpacken von ZIP-Archiven aus nicht vertrauenswürdigen Quellen stets den Dateipfad (zip_entry_name()) auf sogenannte Zip Slip-Angriffe prüfen. Einträge mit Pfaden wie ../../etc/passwd können bei unkritischem Schreiben auf das Dateisystem gefährliche Verzeichnisüberschreibungen verursachen.