Signatur
Beschreibung
Der phar://-Stream-Wrapper ist ein eingebauter PHP-Protokoll-Handler, mit dem Dateien innerhalb eines PHAR-Archivs (PHP Archive) wie gewöhnliche Dateipfade angesprochen werden können. Die URL-Syntax lautet phar:///pfad/zu/archiv.phar/datei/im/archiv.php. Damit können require, include, fopen, file_get_contents und viele weitere Dateioperationen direkt auf Archiv-Inhalte zugreifen.
PHAR-Archive bündeln PHP-Anwendungen oder -Bibliotheken in einer einzigen Datei. Der Wrapper erlaubt es, PHP-Klassen und -Skripte direkt aus dem Archiv zu laden, ohne diese vorher entpacken zu müssen. Er eignet sich hervorragend für die Distribution von Anwendungen als einzelne ausführbare Datei, z. B. bei CLI-Tools wie Composer (composer.phar).
Das Protokoll unterstützt verschiedene Archiv-Formate: ZIP-, TAR- und das native PHAR-Format. Auch verschlüsselte und signierte Archive werden unterstützt, sofern die entsprechenden PHP-Erweiterungen vorhanden sind.
- Lesend: Dateien aus dem Archiv lesen (immer verfügbar)
- Schreibend: Nur möglich, wenn
phar.readonly = Offin derphp.ini - Autoloading: Kann mit
spl_autoload_registerund PHAR-internen Autoloadern kombiniert werden
Beispiele
Datei aus einem PHAR-Archiv einlesen
<?php
// Inhalt einer Datei aus dem PHAR-Archiv lesen
$inhalt = file_get_contents('phar:///var/www/meinprojekt.phar/config/settings.json');
$config = json_decode($inhalt, true);
echo $config['version'];
PHP-Klasse aus PHAR-Archiv einbinden
<?php
// Direkte Einbindung einer PHP-Datei aus dem Archiv
require 'phar:///var/www/tools/meinlib.phar/src/MyClass.php';
$obj = new MyClass();
$obj->doSomething();
PHAR-Archiv erstellen und Datei hinzufügen
<?php
// phar.readonly muss in der php.ini auf Off gesetzt sein!
$phar = new Phar('/tmp/meinapp.phar');
$phar->startBuffering();
$phar->addFromString('index.php', '<?php echo "Hallo aus PHAR!";');
$phar->setStub($phar->createDefaultStub('index.php'));
$phar->stopBuffering();
// Anschließend Datei über den Stream-Wrapper lesen
echo file_get_contents('phar:///tmp/meinapp.phar/index.php');
Verzeichnisinhalt eines PHAR-Archivs auflisten
<?php
// Dateien im Unterverzeichnis 'src' des Archivs auflisten
$iterator = new DirectoryIterator('phar:///var/www/meinapp.phar/src');
foreach ($iterator as $datei) {
if (!$datei->isDot()) {
echo $datei->getFilename() . PHP_EOL;
}
}
// Wichtig · Fallstricke
Sicherheitswarnung: Der phar://-Wrapper ist ein bekannter Angriffsvektor für PHAR-Deserialisierungsangriffe. Wenn Benutzereingaben unkontrolliert als Dateipfade in Funktionen wie file_exists(), fopen() oder copy() verwendet werden, kann ein Angreifer einen manipulierten PHAR-Pfad einschleusen und dadurch den Deserialisierungsmechanismus auslösen. Niemals Benutzereingaben ungeprüft als Dateipfade verwenden!
php.ini-Einstellungen: phar.readonly = On (Standard) verhindert das Erstellen und Modifizieren von PHAR-Archiven. Für die Produktion sollte dieser Wert auf On belassen werden. Zum Deaktivieren des gesamten Wrappers kann phar.cache_list oder allow_url_fopen = Off nicht verwendet werden — stattdessen muss PHP ohne die Phar-Erweiterung kompiliert werden.
Ab PHP 8.0 kann der Wrapper über stream_wrapper_unregister('phar') deaktiviert werden, wenn er nicht benötigt wird, was die Angriffsfläche reduziert.