6

我目前正在为我的框架试验一种扩展机制。每个模块至少包含一个 PHP 文件(定义一个类)和一个 XSL 样式表,但可能会涉及到其他几个文件,所以我立即想到了使用 Phars。

一切都很好地结合在一起,但我注意到如果我不使用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 将仅用于将特定于模块的文件捆绑在一起,并将包含在框架中——在这种情况下独立运行没有任何意义。我想我的问题是,我错过了什么——如果有的话——使用最小的存根代码?为什么压缩版本总是一样的大小?

4

1 回答 1

8

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

文件格式文档中,默认存根被描述为:

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

然后它指向Phar::createDefaultStub,它说:

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

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

为什么压缩版本总是一样的大小?

再次深入文件格式文档,有一个归档格式之间的比较,这解释了 Phar 执行每个文件和整个归档压缩。您可能会看到类似的压缩大小,因为 gzip 无法进一步压缩数据。这是猜测。

于 2012-12-15T22:15:16.440 回答