Phar Tutorial – PHP Archive

Da ich mich heute endlich mal mit einem neuen Feature aus PHP 5.3 beschäftigen konnte, will ich meine Erkenntnisse Niemandem vorenthalten. Das neue Feature nennt sich Phar und ich bin mir sicher, dass wir davon noch viel in Zukunft hören werden. Jetzt gibt es aber erst einmal eine kleine Einführung.

Phar ist eine Zusammenführung der beiden Wörter PHP und Archiv und ähnelt dem .jar-Format von Java (jar = Java Archiv). In einem Phar-Archiv können prinzipiell alle Datei-Fromate verpackt werden und so lassen sich beispielsweise komplette PHP-Anwendungen in einer Datei archivieren, damit sie leichter verbreitet werden kann.
Ein neues Archiv lässt sich mit den folgenden Code-Zeilen anlegen:

$dir = __DIR__.'/';
$archive = new Phar($dir.'myphar.phar.gz');

Wir legen also ein neues Archiv mit dem Namen myphar.phar.gz an, das Gzip komprimiert ist (zu erkennen an der Endung .gz).
Die Phar-Klasse steht natürlich nur dann zur Verfügung, wenn die Extension auch in der php.ini aktiviert wurde.
Als nächstes müssen wir dem Archiv noch Daten zuführen. Dazu legen wir ein neues Verzeichnis test an mit einer Datei hello.php und dem Inhalt

echo 'hello world';

Jetzt können wir folgenden Befehl verwenden, um alle Daten aus dem Test-Verzeichnis in das Archiv zu speichern:

$archive->buildFromDirectory($dir.'test');
$archive->stopBuffering();

Mit der Methode stopBuffering() werden die Daten dann auf die Festplatte geschrieben.

Wir brauchen also nur knapp 4 Zeilen Code, um ein ganzes Archiv anzulegen, aber wie bekommt man die Dateien jetzt wieder heraus? Dazu gibt es mehrere Möglichkeiten. Welche man benutzt, hängt davon ab, was man mit dem Inhalt machen möchte. Zunächst öffnen wir das Phar-Archiv:

$dir = __DIR__.'/';
$archive = new Phar($dir.'myphar.phar.gz');

Jetzt können wir entweder den ganzen Inhalt zur Laufzeit auslesen, oder aber wieder in ein normales Verzeichnis entpacken.

// Alle Dateien auslesen
foreach($archive as $file)
{
	$ext = strrchr($file->getBasename(), '.');
	// PHP-Dateien können per include einfach eingebunden werden.
	if($ext == '.php')
	{
		include $file->getPathname();
	}
}
 
// Alle Dateien in ein normales Verzeichnis entpacken
$archive->extractTo($dir.'myphar');

Wenn man genau weiß, welche PHP-Datei man haben will, kann man diese auch direkt inkludieren, ohne das Archiv zu öffnen. Dazu muss man nur ein „phar://“ vor den Pfad stellen:

$dir = __DIR__.'/';
include 'phar://'.$dir.'myphar.phar.gz/hellp.php';

So, das sind erst eommal die Grundfunktionen, die man von Phar kennen sollte. Aber man merkt schnell, dass Phar ziemlich einfach zu handhaben ist, weil alles schön in Klassen verpackt ist.
Und noch ein letzter Tipp: Phar baut zum größten Teil auf die SPL Klassen SplFileInfo und DirectoryIterator. Die sollte man sich daher mal genauer anschauen.