将PHP编译为op-code并执行opcode

9

PHP通常在执行时通过Zend引擎编译成opcode。

为了避免每次编译,可以使用像APC这样的opcode缓存将opcode保存在共享内存中并重复使用它。

好的,现在似乎还没有像Java那样仅编译PHP为opcode并使用的解决方案。

但是为什么呢?我想知道这个问题的答案,因为这是一个非常显然的想法,所以我猜肯定有原因。

编辑:

核心问题是:

PHP编译不会使opcode缓存变得无用吗?

唯一的“理由”可能就是你不能在现场系统上直接修复代码,这是非常不好的做法。


3
Facebook有一种更好的方法...参见Hip Hop for PHP,链接为https://github.com/facebook/hiphop-php。请注意,此处涉及编程语言PHP的相关技术。 - Jeremy S.
1
很容易...我的问题不是关于将PHP转换为C ++。它是关于操作码的。 - Raffael
1
你可以只使用opcode,APC中有一个设置叫做apc.stat - 如果将其设置为1,则APC不会检查是否有与解析的opcode相关联的PHP文件。这样,你可以将整个项目解析成opcode并基本上删除文件。但是像所有事情一样,这并不是最好的做法。 - N.B.
有趣!但你为什么认为这不是一个好主意?因此,使用apc_bin_dumpfile()将PHP编译为opcode,然后使用APC和您的设置来执行它是可能的吗? - Raffael
@Raffael1984 - 好的,我的错,我没有立即理解你的意思。我不知道如何强制ZendEngine执行未被APC缓存的opcode,这就是为什么我谈论APC的原因。我也不知道如何有效地“存储”opcode而不使用APC(我不是在谈论获取opcode),所以我在我的评论中使用了APC。最终,这就是你所说的 - 仅使用opcode,部署opcode并仅执行opcode - 目前通过使用apc.stat = 0来完成,并在整个项目之后解析,然后删除原始php文件。 - N.B.
显示剩余19条评论
1个回答

3

你提出了一个反对意见。

另一个非常重要的原因是,如果你把编译和运行时分开,无论是在每个发生的时间上还是在它们运行的硬件上,你很快就会遇到复杂的依赖问题——当你尝试在PHP 5.3运行时上运行由PHP 5.1生成的操作码时会发生什么?

这也使得代码调试更加困难——因为调试器必须将操作码映射回源代码。

但你似乎没有问过,更不用说回答一个非常重要的问题,那就是预先生成操作码的好处是什么?

在运行时之前编译操作码是否比缓存操作码有显著的好处呢?两者之间的差异是无法衡量的微小的。

当然,HipHop 的存在理由是,经过本地编译的 PHP 代码比带有操作码缓存的 PHP 运行更快,但这是完全不同的事情。

你认为只在服务器上有操作码是否提高了安全性(通过混淆)?


好的,看起来操作码定义波动且没有向下兼容性是主要障碍。虽然调试不是问题,因为你在开发环境中进行调试,而不需要预编译。我并不是在谈论安全性。 - Raffael
那么你的建议是,在测试/调试时使用与生产环境不同的软件,这样可以吗? - symcbean
3
好的,一个C++开发者也不会调试机器码,我是对的还是不是? - Raffael

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