PHP代码压缩有意义吗?

112

我知道你可以压缩PHP,但我想知道这是否有意义。PHP是一种解释性语言,因此运行速度比编译语言稍慢。我的问题是:如果我压缩PHP,客户端是否会在页面加载等方面看到明显的速度提升?

此外,是否有一种方式可以编译PHP或类似内容?


一个显而易见的点就是混淆,以使你的代码更难移植,这可以是一个合理的目标。 - John
另一个要点是节省服务器空间(如果这很重要的话)。 - George Ogden
8个回答

170
PHP被编译成字节码,然后在类似虚拟机的东西上进行解释。许多其他脚本语言也遵循相同的过程,包括Perl和Ruby。它不像传统的解释语言(比如BASIC)。
如果您尝试"缩小"源代码,则不会有有效的速度增加。使用APC等字节码缓存可以获得主要的速度提升。
Facebook推出了一款名为HipHop的编译器,将PHP源代码转换为C++代码。 PHP大佬之一Rasmus Lerdorf今年早些时候为Digg做了一个演示,介绍了HipHop带来的性能改进。简而言之,它并不比优化代码和使用字节码缓存快太多。对于大多数用户来说,HipHop过于复杂。
Facebook最近还推出了HHVM,这是一个基于他们开发HipHop的新型虚拟机。它仍然很新,并不清楚它是否会为普通用户提供重大的性能提升。

为确保明确表述,请完整阅读该演示。它指出了使用诸如xdebugxhprof等工具对代码进行基准测试和分析,并识别瓶颈的多种方法,这些工具也来自Facebook。


2021更新

HHVM在几个版本前已经与原始的PHP分道扬镳。PHP 7和8带来了许多惊人的性能改进,基本上已经填平了差距。现在,您不再需要做奇怪的事情来提高PHP的性能!

由于性能原因,缩小PHP源代码仍然是没有用处的。


2
请注意,整个字节码/虚拟机的事情如果没有外部(!)字节码缓存其实并没有什么作用。我不明白为什么PHP默认会丢弃字节码... - user395760
我想这可能是一个共享主机的问题。APC从旧的基于6.0的代码分支开始已经默认包含在PHP中。我不确定我们是否会在5.4或者新的代码分支中看到它被默认包含... - Charles
非常感谢提供的信息。不幸的是我没有对服务器进行深度控制(它是租用的)。Web主机是否使用APC? - Bojangles
3
大多数共享主机提供商不使用APC。您应该考虑使用虚拟专用服务器,以便您可以控制配置。VPS通常比普通共享托管更昂贵,但远比实际的专用服务器便宜得多。流行的VPS提供商包括Slicehost和Linode。不要忘记首先对您的代码进行基准测试和分析! - Charles
让代码更紧凑有什么好处吗?比如说,对于 AJAX 发送请求并获取响应,会减少时间吗? - electrikmilk

16
放弃使用PHP代码压缩,转而使用诸如PHP AcceleratorAPC等opcode缓存技术。

或者选择其他类似memcached的解决方案。


3
你的意思不太清楚,是否指的不只是一个操作码缓存? - Treffynnon
5
经过基准测试和性能分析,并确定缓存本身将是最佳性能提升的情况下,Memcached是一种非常有效的方式来提高性能。 - Charles
1
如果您使用的是PHP 5.5,那么您无需安装任何opcode缓存,因为它已经默认包含在内了。 - firewall
1
我实际上查了一下cromulent :(。我同意其他人的看法,在这种情况下使用memcached是误导性的。将数据作为编译过程的一部分进行缓存并不等同于生成的操作码。 - Mike Purcell

6

有一个(非技术性的)要点。

您的主机商可以在他的服务器上监视您的代码。如果您对代码进行缩小和混淆,那么窃听者更难窃取您的想法。

缩小和混淆php代码的一个原因可能是防窃听保护。我认为丑化代码应该是自动部署的一步。


3

通过一些重写(缩短变量名),您可以节省一些内存空间,但这很少有意义。

然而,我设计了一些应用程序,使其能够连接包含的脚本。使用php -w可以显著压缩它,从而为脚本启动带来一些速度增益。但在启用opcode的服务器上,这只能节省一些文件修改时间检查。


3
这不是一个回答,而是一则广告。我一直在开发一个PHP扩展,将Zend操作码转换为静态类型的虚拟机运行。它不能加速任意的PHP代码,但可以让您编写比常规PHP更快的代码。关键在于静态类型。在现代CPU上,动态语言会频繁出现分支预测错误。PHP数组是哈希表,这也会产生高成本:大量的分支预测错误、缓存效率低下、内存预取效率差,以及没有SIMD优化。分支预测错误和缓存未命中尤其是当今处理器的致命弱点。我的小型虚拟机通过使用静态类型和C数组来避开这些问题。结果运行大约快了十倍。这是使用字节码解释。该扩展可以选择通过gcc编译函数。在这种情况下,速度可以提高两到五倍。
这是感兴趣的人的链接:

https://github.com/chung-leong/qb/wiki

需要注意的是,该扩展程序并不是通用的 PHP 加速器,您需要编写专门针对该扩展的代码。


1

有PHP编译器...请参考这个之前的问题以获取列表;但是(除非你像Facebook一样大或者你的应用程序是面向客户端运行的),它们通常会带来更多麻烦,不值得。

简单的opcode缓存将为您带来更多的收益。或者对您的代码进行分析以确定瓶颈,然后进行优化。


1

1
“点”在于使文件更小,因为比起较大的文件,小文件加载速度更快。此外,移除空格会让解析稍微快一点,因为这些字符不需要被解析出来。”
“这会有明显的效果吗?几乎不会,除非文件很大并且大小差别很大。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接