最小的PHP Phar存根

时间:2012-12-14 10:25:36

标签: php phar

我目前正在尝试使用我的框架的扩展机制。每个模块至少包含一个PHP文件(定义一个类)和一个XSL样式表,但可能涉及其他几个文件,因此我立即考虑使用Phars。

一切都很好地在一起玩但是我注意到如果我没有使用createDefaultStub()而是在下面的代码片段中构建了Phar,那么结果是大小的四分之一 - 并且小于压缩版本。 / p>

$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将仅用于将特定于模块的文件捆绑在一起并将包含在框架中 - 独立运行在此上下文中没有任何意义。我想我的问题是,我错过了什么 - 如果有的话 - 使用最小的存根代码?为什么压缩版本的大小总是相同?

1 个答案:

答案 0 :(得分:7)

  

我想我的问题是,我错过了什么 - 如果有的话 - 使用最小的存根代码?

file format documentation中,默认存根被描述为:

  

基于phar的Phar存档的默认存根包含大约7k的代码,用于提取phar的内容并执行它们。

然后指向Phar::createDefaultStub,其中说:

  

此方法提供了一种简单易用的方法来创建将从phar存档运行启动文件的存根。此外,可以指定不同的文件,以便从命令行运行phar存档,而不是通过Web服务器运行。加载器存根还调用Phar :: interceptFileFuncs()以允许轻松捆绑访问文件系统的PHP应用程序。 如果没有pha​​r扩展名,加载程序存根将把phar存档解压缩到临时目录,然后对文件进行操作。关闭功能会在退出时删除临时文件。

强调补充,因为这是默认存根如此之大的原因。如果您可以假设您将始终在PHP 5.3或更高版本下运行,那么您可能不需要默认存根,并且可以坚持使用最小__HALT_COMPILER

  

为什么压缩版本总是大小相同?

再次潜入文件格式文档,有一个comparison between archive formats,它解释了Phar执行每个文件和整个存档压缩。您可能会看到类似的压缩大小,因为gzip无法进一步压缩数据。这是推测。