从我的理解,如果你使用像APC,eAccelerator等PHP缓存程序,那么操作码将被存储在内存中,以便在后续请求时更快地执行。我的问题是,为什么它不会总是更好/更快地编译你的脚本,假设你正在使用像phc甚至HPHP这样的编译器(虽然我知道他们有动态结构的问题)?为什么还要存储操作码,因为Zend引擎必须重新读取它们,当你可以编译并跳过那一步时,它使用C函数来执行它?
答案 0 :(得分:2)
你不能简单地编译成c并让你的php脚本以相同的方式执行。 HPHP进行了真正的编译,但它不支持php功能的整个超集。
其他编译器实际上只是在二进制文件中嵌入了一个php解释器,所以你还是没有真正编译代码。
PHP不是要编译的。对于99%的应用程序,操作码缓存非常快且足够好。如果你有facebook级别的流量,并且你已经优化了后端数据库,那么编译可能是提高性能的唯一方法。
PHP不是std c库的薄层。
答案 1 :(得分:1)
如果PHP没有eval()
,那么可能可以(相对)轻松地进行直接的PHP->编译二进制转换。但是,由于PHP本身可以通过eval()动态地动态构建/执行脚本,因此不可能执行完全二进制文件。任何二进制文件都必须包含整个PHP,因为编译器不知道你的动态代码可以做什么。你会从一个小的1或2k脚本变成一个巨大的数兆字节二进制文件。