Start · Sprachen · PHP · Referenz · phar://

phar://

Funktion

Stream-Wrapper für PHP-Archive (PHAR), der den Zugriff auf Dateien innerhalb eines PHAR-Archivs über URLs ermöglicht.

seit PHP 5.3.0 Kategorie: misc

Signatur

phar://

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 = Off in der php.ini
  • Autoloading: Kann mit spl_autoload_register und 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'];
1.0.0

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');
<?php echo "Hallo aus PHAR!";

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;
    }
}
MyClass.php Helpers.php

// 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.