W3docs

zip_entry_read()

Die zip_entry_read()-Funktion liest den Inhalt einer Datei in einem ZIP-Archiv. Seit PHP 8.0 entfernt – verwenden Sie stattdessen ZipArchive.

Die Funktion zip_entry_read() war eine eingebaute PHP-Funktion, mit der der Inhalt einer einzelnen Datei (eines Eintrags) innerhalb eines geöffneten ZIP-Archivs byteweise gelesen werden konnte. Sie gab die gelesenen Daten als string zurück.

Wichtig: Die gesamte prozedurale zip_entry_*-Familie – einschließlich zip_entry_read() – wurde in PHP 7.4 als veraltet markiert und in PHP 8.0 entfernt. Es gibt keinen direkten Ersatz; stattdessen liest modernes PHP ZIP-Einträge über die objektorientierte Klasse ZipArchive. Diese Seite dokumentiert die veraltete Funktion als Referenz und zeigt anschließend den ZipArchive-Ansatz, den Sie heute verwenden sollten. Um überhaupt mit ZIP-Dateien arbeiten zu können, muss die zip-Erweiterung in Ihrer PHP-Installation aktiviert sein.

Syntax (Legacy)

string zip_entry_read(resource $zip_entry, int $length = 1024)
ParameterBeschreibung
$zip_entryDas Entry-Handle, das von zip_entry_open() zurückgegeben wird, nachdem das Archiv mit zip_open() geöffnet und ein Eintrag mit zip_read() abgerufen wurde.
$lengthOptional. Die Anzahl der zu lesenden Bytes. Da ZIP-Einträge komprimiert gespeichert werden, entspricht dies der Anzahl der zurückgegebenen unkomprimierten Bytes. Standardwert: 1024.

Rückgabewert: Der gelesene Inhalt als string oder false bei einem Fehler. Wie beim Lesen einer Datei rückt jeder wiederholte Aufruf durch den Eintrag vor, bis dieser erschöpft ist.

Einen ZIP-Eintrag mit ZipArchive lesen (modern)

Der sauberste Ersatz ist ZipArchive::getFromName(), der den gesamten dekomprimierten Inhalt eines Eintrags anhand seines Dateinamens zurückgibt – ohne manuellen Open/Read/Close-Loop pro Eintrag.

Eine Datei aus einem ZIP-Archiv in PHP lesen

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    $contents = $zip->getFromName('readme.txt');
    $zip->close();

    if ($contents !== false) {
        echo $contents;
    } else {
        echo "Entry not found in archive.";
    }
} else {
    echo "Failed to open archive.";
}

Hier gibt open() bei Erfolg true zurück (es kann auch einen Fehlercode zurückgeben, daher strikt mit === true vergleichen). getFromName() dekomprimiert den gesamten Eintrag und gibt ihn in einem einzigen Aufruf zurück. Verwenden Sie stattdessen getFromIndex($i), wenn Sie den Eintrag an einer numerischen Position statt nach Namen abrufen möchten.

Alle Einträge durchlaufen

Eine häufige Aufgabe ist das Lesen aller Dateien in einem Archiv. numFiles liefert die Anzahl der Einträge und statIndex() die Metadaten jedes Eintrags:

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        $data = $zip->getFromIndex($i);
        echo $name . " (" . strlen($data) . " bytes)\n";
    }
    $zip->close();
}

Große Einträge streamen

getFromName() lädt den gesamten Eintrag in den Arbeitsspeicher. Bei einer großen Datei öffnen Sie den Eintrag stattdessen als Stream und lesen ihn in Blöcken – das ist der eigentliche moderne Äquivalent zum blockweisen zip_entry_read()-Verhalten:

$zip = new ZipArchive();

if ($zip->open('example.zip') === true) {
    $stream = $zip->getStream('big-log.txt');
    if ($stream) {
        while (!feof($stream)) {
            $chunk = fread($stream, 8192); // read 8 KB at a time
            echo $chunk;
        }
        fclose($stream);
    }
    $zip->close();
}

Der zurückgegebene Stream ist eine gewöhnliche PHP-Stream-Ressource, sodass vertraute Funktionen wie fread() und feof() direkt darauf angewendet werden können.

Wann würde ich das verwenden?

  • Lesen von Konfigurations- oder Template-Dateien, die in einem .zip ausgeliefert werden, ohne sie auf die Festplatte zu entpacken.
  • Prüfen eines Uploads (z. B. eine .docx- oder .xlsx-Datei, die ZIP-Container sind) Eintrag für Eintrag.
  • Verarbeiten großer archivierter Logs durch Streaming, anstatt zuerst alles zu entpacken.

Wenn Sie nur die Bytes einer einzelnen Datei benötigen und es keine Rolle spielt, dass sie in einem ZIP liegt, ist das vorherige Extrahieren und die Verwendung von file_get_contents() ebenfalls eine valide Option.

Fazit

zip_entry_read() gehörte zur veralteten prozeduralen ZIP-API von PHP, die in 7.4 als veraltet markiert und in 8.0 entfernt wurde. Auf jeder unterstützten PHP-Version sollten ZIP-Einträge mit der Klasse ZipArchive gelesen werden: Verwenden Sie getFromName() / getFromIndex() für vollständige Einträge, iterieren Sie mit numFiles und nutzen Sie getStream() mit fread(), wenn ein Eintrag zu groß ist, um ihn vollständig im Arbeitsspeicher zu halten.

Übungen

Übung
Welches ist die korrekte Methode, um in PHP 8.0+ den Inhalt einer einzelnen Datei aus einem geöffneten ZipArchive zu lesen?
Welches ist die korrekte Methode, um in PHP 8.0+ den Inhalt einer einzelnen Datei aus einem geöffneten ZipArchive zu lesen?
Was this page helpful?