Start · Sprachen · PHP · Referenz · PharData

PharData

Klasse

Bietet eine High-Level-Schnittstelle zum Zugriff auf und Erstellen von Tar- und Zip-Archiven, ohne dass eine <code>phar.readonly</code>-Einschränkung gilt.

seit PHP 5.3.0 Kategorie: misc

Signatur

class PharData extends RecursiveDirectoryIterator implements Countable, ArrayAccess

Beschreibung

PharData ermöglicht das Erstellen, Lesen und Manipulieren von Tar- (.tar, .tar.gz, .tar.bz2) und Zip-Archiven (.zip), ohne dass diese als ausführbares Phar-Archiv vorliegen müssen. Im Gegensatz zur Klasse Phar unterliegt PharData nicht der INI-Einstellung phar.readonly, weshalb sie auch in Umgebungen nutzbar ist, in denen das Erstellen von Phar-Archiven deaktiviert ist.

Die Klasse erbt von RecursiveDirectoryIterator und implementiert Countable sowie ArrayAccess. Damit können Einträge im Archiv wie Array-Elemente angesprochen werden ($archive['datei.txt']). Das Durchlaufen aller enthaltenen Dateien ist über Standard-Iterator-Mechanismen möglich.

Typische Anwendungsfälle sind: automatisiertes Packen von Release-Dateien, Entpacken von hochgeladenen Zip- oder Tar-Archiven, Lesen einzelner Dateien aus einem Archiv ohne vollständiges Entpacken sowie die Konvertierung zwischen Archiv-Formaten (z. B. Tar zu Zip) via convertToData().

Viele Methoden werfen bei Fehlern eine BadMethodCallException, PharException oder UnexpectedValueException. Es empfiehlt sich daher, Operationen in try-catch-Blöcke zu fassen.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zum Archiv. Existiert die Datei noch nicht, wird sie beim ersten Schreibzugriff angelegt. Die Dateiendung bestimmt das Archiv-Format (.tar, .tar.gz, .tar.bz2, .zip).
$flags int 0 Optionale Flags für den darunterliegenden RecursiveDirectoryIterator, z. B. FilesystemIterator::SKIP_DOTS.
$alias string Ein optionaler Alias-Name für das Archiv, der intern beim Stream-Wrapper verwendet wird.
$fileformat int Explizite Angabe des Archiv-Formats, falls es nicht aus der Dateiendung ermittelt werden soll. Mögliche Werte: Phar::TAR, Phar::ZIP.

Beispiele

Zip-Archiv erstellen und Dateien hinzufügen

<?php
try {
    $zip = new PharData('/tmp/mein-archiv.zip');

    // Einzelne Datei aus dem Dateisystem hinzufügen
    $zip->addFile('/var/www/html/readme.txt', 'readme.txt');

    // Datei aus einem String erzeugen
    $zip->addFromString('info.txt', 'Erstellt am ' . date('Y-m-d'));

    // Gesamtes Verzeichnis hinzufügen
    $zip->buildFromDirectory('/var/www/html/assets', '/\.css$/');

    echo 'Archiv enthält ' . count($zip) . ' Einträge.' . PHP_EOL;
} catch (Exception $e) {
    echo 'Fehler: ' . $e->getMessage();
}
Archiv enthält 3 Einträge.

Tar.gz-Archiv entpacken

<?php
try {
    $tar = new PharData('/tmp/release.tar.gz');

    // Alle Dateien in ein Verzeichnis extrahieren
    $tar->extractTo('/tmp/release-entpackt/', null, true); // true = überschreiben

    // Einzelne Datei lesen ohne vollständiges Entpacken
    $inhalt = file_get_contents(
        'phar:///tmp/release.tar.gz/src/index.php'
    );
    echo substr($inhalt, 0, 100);
} catch (PharException $e) {
    echo 'Phar-Fehler: ' . $e->getMessage();
}

Tar-Archiv in Zip konvertieren

<?php
try {
    $tar = new PharData('/tmp/paket.tar');

    // Konvertierung erzeugt /tmp/paket.zip
    $zip = $tar->convertToData(Phar::ZIP);

    echo 'Zip-Datei erstellt: ' . $zip->getPath() . PHP_EOL;
} catch (Exception $e) {
    echo 'Fehler bei Konvertierung: ' . $e->getMessage();
}
Zip-Datei erstellt: /tmp/paket.zip

// Wichtig · Fallstricke

Sicherheitshinweis beim Entpacken: Prüfen Sie Pfade in Archiv-Einträgen immer auf sogenannte Path-Traversal-Angriffe (z. B. ../../etc/passwd). extractTo() bietet keinen eingebauten Schutz dagegen. Validieren Sie deshalb Archiv-Inhalte vor dem Entpacken, insbesondere bei Nutzereingaben.

Komprimierung: Für komprimierte Tar-Archive (.tar.gz, .tar.bz2) müssen die PHP-Erweiterungen zlib bzw. bz2 geladen sein. Zip-Unterstützung erfordert die zip-Erweiterung.

Unterschied zu Phar: PharData kann nicht als selbst-ausführbares Phar-Archiv genutzt werden und enthält keinen PHP-Bootstrap-Stub. Sie ist rein für Daten-Archive gedacht. phar.readonly gilt für PharData nicht.

Große Archive: Bei sehr großen Archiven kann der Speicherbedarf erheblich sein. Erwägen Sie in solchen Fällen den Einsatz von Shell-Kommandos via exec() oder spezialisierter Bibliotheken.