首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小PHP Phar存根

最小PHP Phar存根
EN

Stack Overflow用户
提问于 2012-12-14 18:25:36
回答 1查看 1.4K关注 0票数 6

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

一切都运行得很好,但我注意到,如果我不使用createDefaultStub(),而是像下面的代码片段那样构造Phar,那么结果是大小的四分之一-而且比压缩版本小。

代码语言:javascript
复制
$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);

示例文件大小:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-16 06:15:16

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

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

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

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

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

强调,因为这就是默认存根如此之大的原因。如果您可以假设您将始终在PHP5.3或更高版本下操作,那么您可能不需要缺省存根,而可以坚持使用最小的__HALT_COMPILER

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

再次深入研究文件格式文档,有一个comparison between archive formats,它解释了Phar同时执行每个文件和整个归档的压缩。您可能会看到类似的压缩大小,因为gzip不能进一步压缩数据。这是一种猜测。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13876791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档