Signatur
Beschreibung
Phar ermöglicht es, vollständige PHP-Anwendungen oder Bibliotheken in einer einzigen, portablen Archivdatei zu bündeln. Das Archiv kann direkt ausgeführt werden, als wären die enthaltenen Dateien im Dateisystem vorhanden. Es werden drei Archivformate unterstützt: Phar::TAR, Phar::ZIP und das native Phar::PHAR-Format.
Mit Phar lassen sich Archive sowohl lesen als auch erstellen (sofern die PHP-Einstellung phar.readonly in der php.ini auf 0 gesetzt ist). Dateien innerhalb des Archivs können über den Stream-Wrapper phar:// angesprochen werden, z. B. phar://meinarchiv.phar/src/klasse.php. Die Klasse implementiert ArrayAccess, sodass einzelne Archiv-Einträge wie Array-Elemente gelesen und geschrieben werden können.
Typische Einsatzbereiche sind das Verteilen von CLI-Tools, Frameworks oder Bibliotheken als Single-File-Executable sowie das Deployment von Web-Anwendungen. Bekannte Tools wie Composer (composer.phar) oder PHPUnit nutzen dieses Format.
Über Methoden wie addFile(), addFromString(), buildFromDirectory() und setStub() kann ein Archiv vollständig programmatisch aufgebaut werden. Signaturen (MD5, SHA1, SHA256, SHA512, OpenSSL) sichern die Integrität der Archive.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filename Pflicht | string | Pfad zur Phar-Datei. Die Datei muss die Erweiterung .phar haben oder in der INI-Einstellung phar.file_highlight gelistet sein. |
|
| $flags | int | 0 | Flags für den zugrundeliegenden RecursiveDirectoryIterator, z. B. FilesystemIterator::SKIP_DOTS. |
| $alias | string | Alias-Name des Archivs, der intern für den phar://-Stream-Wrapper verwendet wird. Wenn leer, wird der Dateiname verwendet. |
Beispiele
Phar-Archiv aus einem Verzeichnis erstellen
<?php
// phar.readonly muss in der php.ini auf 0 gesetzt sein!
$pharDatei = '/tmp/meinprojekt.phar';
if (file_exists($pharDatei)) {
unlink($pharDatei);
}
$phar = new Phar($pharDatei, 0, 'meinprojekt.phar');
$phar->startBuffering();
// Gesamtes Verzeichnis hinzufügen
$phar->buildFromDirectory(__DIR__ . '/src', '/\.php$/');
// Stub definieren (Einstiegspunkt)
$phar->setStub(
$phar->createDefaultStub('index.php')
);
$phar->stopBuffering();
echo "Archiv erstellt: {$pharDatei}" . PHP_EOL;
echo "Dateien im Archiv: " . count($phar) . PHP_EOL;
Dateien aus einem Phar-Archiv lesen
<?php
$phar = new Phar('/tmp/meinprojekt.phar');
// Alle enthaltenen Dateien auflisten
foreach ($phar as $dateiname => $eintrag) {
echo $dateiname . ' (' . $eintrag->getSize() . ' Bytes)' . PHP_EOL;
}
// Einzelne Datei über ArrayAccess lesen
$inhalt = $phar['index.php']->getContent();
echo "Inhalt von index.php:" . PHP_EOL;
echo $inhalt;
Phar-Archiv mit einzelnen Dateien und Kompression erstellen
<?php
// phar.readonly = 0 in php.ini erforderlich
$phar = new Phar('/tmp/tool.phar');
$phar->startBuffering();
// Dateien aus Strings hinzufügen
$phar->addFromString('index.php', '<?php echo "Hallo aus dem Phar!";');
$phar->addFromString('lib/util.php', '<?php function helfer() { return 42; }');
// Datei vom Dateisystem hinzufügen
$phar->addFile('/etc/hostname', 'data/hostname.txt');
// Stub setzen
$phar->setStub('<?php Phar::mapPhar(); include "phar://tool.phar/index.php"; __HALT_COMPILER();');
// Kompression aktivieren (erfordert zlib-Extension)
// $phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
echo "Fertig. Enthält " . count($phar) . " Dateien." . PHP_EOL;
// Wichtig · Fallstricke
Schreibzugriff: Standardmäßig ist die INI-Direktive phar.readonly auf 1 gesetzt, was das Erstellen und Modifizieren von Phar-Archiven verhindert. Zum Erstellen von Archiven muss phar.readonly = 0 in der php.ini gesetzt werden – dies sollte jedoch nur in kontrollierten Umgebungen (CLI, Build-Skripte) erfolgen.
Sicherheit: Phar-Archive können über den phar://-Stream-Wrapper geladen werden. Da PHP Phar-Metadaten beim Öffnen von Dateien deserialisiert, können manipulierte Phar-Archive in Verbindung mit unsicheren Dateioperationen (z. B. file_exists(), fopen()) gefährliche Objekt-Injections auslösen (Phar Deserialization Attack). Nutzer-kontrollierte Dateipfade sollten daher niemals ungefiltert an Dateifunktionen übergeben werden.
Stub-Größe: Phar-Archive enthalten einen Stub (ausführbarer PHP-Code am Anfang der Datei), der mit __HALT_COMPILER(); enden muss. Die Stub-Größe ist auf 1 MB begrenzt.
Extension-Anforderungen: Kompression mit GZ oder BZ2 erfordert die entsprechenden PHP-Extensions (zlib bzw. bz2). OpenSSL-Signaturen erfordern die openssl-Extension.