Start · Sprachen · PHP · Referenz · zip://

zip://

Funktion

Stream-Wrapper für den direkten Zugriff auf Dateien innerhalb eines ZIP-Archivs über PHP-Datei-Funktionen.

seit PHP 4.3.0 Kategorie: misc

Signatur

zip://archive.zip#dir/file.txt

Beschreibung

zip:// ist ein eingebauter PHP-Stream-Wrapper, der es ermöglicht, einzelne Dateien innerhalb eines ZIP-Archivs direkt über Standard-Datei-Funktionen wie fopen(), file_get_contents(), include() oder copy() zu lesen, ohne das Archiv vorher manuell zu entpacken.

Die Syntax lautet zip://pfad/zum/archiv.zip#pfad/zur/datei/im/archiv. Der Pfad zum Archiv kann absolut oder relativ angegeben werden; der Pfad zur Zieldatei innerhalb des Archivs wird durch eine Raute (#) vom Archivpfad getrennt.

Der Wrapper eignet sich besonders für den schreibgeschützten Zugriff auf in ZIP-Dateien verpackte Ressourcen, z. B. Konfigurationsdateien, Templates oder Assets, die zusammen ausgeliefert werden. Wichtig: Der Wrapper unterstützt nur lesenden Zugriff – das Schreiben in ZIP-Archive über diesen Wrapper ist nicht möglich.

Für komplexere Operationen wie das Erstellen oder Modifizieren von ZIP-Archiven sollte die ZipArchive-Klasse verwendet werden.

Parameter

Name Typ Default Beschreibung
$archive Pflicht string Absoluter oder relativer Dateisystempfad zur ZIP-Datei, z. B. /var/data/archiv.zip.
$entry Pflicht string Pfad zur gewünschten Datei innerhalb des ZIP-Archivs, getrennt vom Archivpfad durch #, z. B. config/settings.ini.

Rückgabewert

Typ
resource|string|false
Beschreibung
Je nach verwendeter Funktion: fopen() gibt eine Stream-Ressource zurück, file_get_contents() den Inhalt als string oder false bei Fehler.

Beispiele

Dateiinhalt aus ZIP-Archiv lesen

<?php
// Eine Textdatei direkt aus einem ZIP-Archiv lesen
$inhalt = file_get_contents('zip:///var/www/daten/archiv.zip#dokumente/readme.txt');

if ($inhalt !== false) {
    echo $inhalt;
} else {
    echo 'Datei konnte nicht gelesen werden.';
}
Inhalt der Datei readme.txt aus dem ZIP-Archiv

ZIP-Eintrag zeilenweise mit fopen() lesen

<?php
// Stream öffnen und zeilenweise verarbeiten
$handle = fopen('zip://archiv.zip#daten/liste.csv', 'r');

if ($handle) {
    while (($zeile = fgets($handle)) !== false) {
        echo htmlspecialchars($zeile) . "<br>\n";
    }
    fclose($handle);
} else {
    echo 'Archiv oder Datei nicht gefunden.';
}
Zeilenweise Ausgabe des CSV-Inhalts aus dem ZIP-Archiv

PHP-Datei aus ZIP einbinden (include)

<?php
// Eine PHP-Datei direkt aus einem ZIP-Archiv einbinden
// Achtung: Sicherheitsrisiko bei nicht vertrauenswürdigen Archiven!
include 'zip:///opt/app/plugins.zip#plugins/mein-plugin.php';

// Wichtig · Fallstricke

Sicherheitshinweis: Das Einbinden von PHP-Dateien aus ZIP-Archiven über include oder require ist gefährlich, wenn der Archivpfad oder der Eintragspfad von Benutzereingaben abhängt. Dies kann zu Remote-Code-Execution (RCE) führen. Nutzereingaben dürfen niemals ungeprüft in zip://-Pfade einfließen.

Der Wrapper ist schreibgeschützt. Versuche, über fwrite() oder ähnliche Funktionen in einen zip://-Stream zu schreiben, schlagen fehl. Für schreibende Zugriffe muss ZipArchive genutzt werden.

In manchen Umgebungen muss die php_zip-Erweiterung explizit aktiviert sein (extension=zip in der php.ini). Ohne diese Erweiterung steht der Wrapper nicht zur Verfügung.

Der Pfad-Trenner innerhalb des Archivs (#) darf nicht URL-kodiert werden; dies würde zu einem Fehler führen.