Signatur
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
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";
}
?>
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";
}
?>
// 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.