2012-12-14 45 views
6

我目前正在試驗我的框架的擴展機制。每個模塊至少包含一個PHP文件(定義一個類)和一個XSL樣式表,但可能涉及其他幾個其他文件,因此我立即想到了使用Phars。最小PHP Phar存根

一切都很好地在一起玩,但我注意到如果我沒有使用createDefaultStub()而是像下面的代碼片段那樣構造Phar,那麼結果是大小的四分之一 - 並且小於壓縮版本。

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

示例文件大小:

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) 

的的Phar只會被用來保持捆綁在一起的模塊特定的文件,將包括在一個框架 - 獨立運行也不會在這任何意義上下文。我想我的問題是,我錯過了什麼 - 如果有的話 - 使用最小的存根代碼?爲什麼壓縮版本的大小始終相同?

回答

7

我想我的問題是,我錯過了 - 如果有的話 - 使用最小的存根代碼?

file format documentation,缺省短線被描述爲:

用於基於PHAR-Phar歸檔缺省短線含有大約的代碼,以提取藥業股份的內容,並執行它們7K。

然後,它指向Phar::createDefaultStub,它說:

這種方法提供了一個簡單易用的方法來創建將運行在歸檔藥業的啓動文件存根。此外,可以指定不同的文件來從命令行運行phar歸檔文件,而不是通過Web服務器運行。加載程序存根也調用Phar :: interceptFileFuncs()來允許輕鬆捆綁訪問文件系統的PHP應用程序。 如果phar擴展名不存在,加載程序存根將把phar存檔提取到臨時目錄,然後對這些文件進行操作。關閉功能在退出時擦除臨時文件。

着重強調,因爲這是原因缺省短線是如此之大。如果你可以假設你會永遠PHP 5.3下運行或更高版本,你可能不需要缺省短線,可與最小__HALT_COMPILER

棒和爲什麼是壓縮版本總是相同的大小?

跳水再次到文件格式的文檔,有一個comparison between archive formats,這解釋了執行的Phar每個文件和全存檔壓縮兩者。您可能會看到類似的壓縮大小,因爲gzip無法進一步壓縮數據。這是猜測。

+2

+1:非常有幫助,寫得很好。 –