我目前正在为我的框架尝试扩展机制。每个模块至少包含一个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将仅用于将特定于模块的文件捆绑在一起并包含在框架中-在这种情况下,独立运行是没有任何意义的。我想我的问题是,使用最小 stub 代码会错过什么(如果有的话)?为何压缩版本总是相同大小?

最佳答案



file format documentation中,默认 stub 描述为:



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



添加重点,因为这是默认 stub 太大的原因。如果可以假设您始终在PHP 5.3或更高版本下运行,则可能不需要默认的 stub ,并且可以坚持使用最少的__HALT_COMPILER


再次深入到文件格式文档中,有一个comparison between archive formats,它说明Phar同时执行按文件压缩和整体归档压缩。您可能会看到类似的压缩大小,因为gzip无法再压缩数据。这是猜测。

关于php - 最小的PHP Phar stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13876791/

10-16 00:37