Signatur
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();
}
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();
}
// 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.