2012-12-14 21 views
6

Attualmente sto sperimentando un meccanismo di estensione per il mio framework. Ogni modulo è costituito da almeno un file PHP (che definisce una singola classe) e un foglio di stile XSL, ma potenzialmente molti altri file potrebbero essere coinvolti, così ho pensato subito di usare Phars.Stub PHP Phar minimo

Tutto sta funzionando bene insieme ma ho notato se non ho usato createDefaultStub() e invece ho costruito il Phar come nel seguente frammento, il risultato è un quarto della dimensione - ed è più piccolo della versione compressa.

$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); 

dimensioni dei file Esempio:

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) 

Il Phar sarà semplicemente essere utilizzato per mantenere i file specifici moduli in bundle insieme e saranno inclusi in un quadro - in esecuzione standalone non avrebbe alcun senso in questo contesto. Credo che la mia domanda sia: cosa mi sto perdendo, se mai, con l'uso del codice stub minimo? E perché la versione compressa ha sempre le stesse dimensioni?

risposta

7

Credo che la mia domanda è, cosa mi sto perdendo - se non altro - con l'utilizzo del codice stub minimo?

Nel file format documentation, lo stub di default è descritto come:

Lo stub predefinita per gli archivi Phar phar a base contiene circa 7k di codice per estrarre il contenuto del phar ed eseguirli.

E poi indica Phar::createDefaultStub, che dice:

Questo metodo fornisce un metodo semplice e veloce per creare uno stub che verrà eseguito un file di avvio dall'archivio phar. Inoltre, è possibile specificare diversi file per eseguire l'archivio phar dalla riga di comando o attraverso un server web. Lo stub del caricatore chiama anche Phar :: interceptFileFuncs() per consentire il facile raggruppamento di un'applicazione PHP che accede al file system. Se l'estensione phar non è presente, lo stub del caricatore estrarrà l'archivio phar in una directory temporanea e quindi opererà sui file. Una funzione di arresto cancella i file temporanei in uscita.

Enfasi aggiunta, poiché questo è il motivo per cui lo stub predefinito è così grande. Se si può supporre che avrete sempre operare sotto PHP 5.3 o versione successiva, probabilmente non è necessario lo stub di default e può attaccare con il minimo __HALT_COMPILER

e perché è la versione compressa sempre della stessa dimensione?

Diving ancora una volta nella documentazione di formato di file, c'è un comparison between archive formats, che spiega che Phar esegue sia per file e compressione intero archivio. È probabile che tu veda dimensioni di compressione simili perché gzip non può comprimere ulteriormente i dati. Questa è una speculazione.

+2

+1: molto utile e ben scritto. –