2012-12-14 3 views
6

Ich experimentiere derzeit mit einem Erweiterungsmechanismus für mein Framework. Jedes Modul besteht aus mindestens einer PHP-Datei (die eine einzelne Klasse definiert) und einem XSL-Stylesheet, aber möglicherweise könnten mehrere andere Dateien beteiligt sein, so dass ich sofort dachte, Phars zu verwenden.Minimal PHP Phar Stub

Alles spielt gut zusammen, aber ich merkte, wenn ich nicht createDefaultStub() verwendet habe und konstruiert stattdessen die Phar wie im folgenden Code-Schnipsel dann ist das Ergebnis ein Viertel der Größe - und ist kleiner als die komprimierte Version.

$phar = new Phar('Example.phar', 0, 'Example.phar'); 
$phar->buildFromDirectory(__DIR__ . '/src'); 
$phar->setStub('<?php __HALT_COMPILER();'); 
$phar->setSignatureAlgorithm(Phar::SHA256); 
$phar->compress(Phar::GZ); 

Beispiel Dateigrößen:

8799 14 Dec 09:37 ExampleCog.phar (using createDefaultStub()) 
2143 14 Dec 10:08 ExampleCog.phar (using __HALT_COMPILER()) 
3373 14 Dec 10:08 ExampleCog.phar.gz (consistent with either method) 

Die Phar wird einfach verwendet werden modulspezifische Dateien gebündelt zusammen zu halten und wird in einem Rahmen aufgenommen werden - läuft Standalone keinen Sinn machen würde, nicht in dieser Kontext. Ich denke, meine Frage ist, was verpasse ich - wenn überhaupt - mit dem minimalen Stub-Code? Und warum hat die komprimierte Version immer die gleiche Größe?

Antwort

7

Ich denke, meine Frage ist, was verpasse ich - wenn überhaupt - mit dem minimalen Stubcode?

Im file format documentation, wird die Standard-Stub wie beschrieben:

Der Standard Stub für phar-basierte Phar Archiv enthält etwa 7k Code den Inhalt der phar und führen sie zu extrahieren.

Es zeigt dann auf Phar::createDefaultStub, die sagt:

Dieses Verfahren eine einfache und einfache Methode bietet eine Stub zu erstellen, die eine Startdatei aus dem phar Archiv ausgeführt werden. Außerdem können verschiedene Dateien angegeben werden, um das phar-Archiv über die Befehlszeile oder über einen Webserver auszuführen. Der Loader-Stub ruft auch Phar :: interceptFileFuncs() auf, um das einfache Bündeln einer PHP-Anwendung zu ermöglichen, die auf das Dateisystem zugreift. Wenn die phar-Erweiterung nicht vorhanden ist, extrahiert der Loader-Stub das phar-Archiv in ein temporäres Verzeichnis und bearbeitet dann die Dateien. Eine Shutdown-Funktion löscht die temporären Dateien beim Beenden.

Hervorhebung hinzugefügt, da dies der Grund ist, dass der Standard-Stub so groß ist. Wenn Sie davon ausgehen können, dass Sie immer unter PHP 5.3 oder höher arbeiten werden, brauchen Sie vermutlich nicht den Standard-Stub und können mit den minimalen __HALT_COMPILER

kleben Und warum ist die komprimierte Version immer die gleiche Größe?

Tauchen wieder in die Dokumentation zum Dateiformat, gibt es eine comparison between archive formats, was erklärt, dass Phar sowohl führt pro-Datei und Voll Archiv Kompression. Wahrscheinlich sehen Sie ähnliche Komprimierungsgrößen, da gzip die Daten nicht weiter komprimieren kann. Das ist Spekulation.

+2

+1: Sehr hilfreich und gut geschrieben. –