2011-06-29 42 views
5

从我的理解,如果你使用PHP缓存程序如APC,eAccelerator等,那么操作码将被存储在内存中,以便在后续请求时更快执行。我的问题是,为什么不总是更好/更快地编译你的脚本,假设你使用编译器如phc甚至是HPHP(尽管我知道他们在动态构造方面有问题)?为什么还要存储操作码,因为Zend引擎需要重新读取操作码,因为Zend引擎使用C函数来执行操作,而您只需编译并跳过该步骤?PHP缓存问题vs编译

+0

还有这个问题的第2部分,我开始一个单独的线程:http://stackoverflow.com/questions/6525187/why-are-dynamic-constructs-difficult-for-php-compilers-hphp – blacktie24

回答

2

你不能简单地编译为c,并让你的php脚本以相同的方式执行。 HPHP做了真正的编译,但它不支持php特性的整个超集。

其他编译器实际上只是在二进制文件中嵌入了一个php解释器,所以你并没有真正编译代码。

PHP并不打算编译。操作码缓存非常快,足以满足99%的应用程序。如果您拥有Facebook的流量级别,并且您已经优化了后端数据库,则编译可能是提高性能的唯一方法。

PHP不是std c库的薄层。

+0

gracias抽出时间回复。当你说“PHP不是std c库的薄层”时,你能进一步解释你的意思吗? – blacktie24

1

如果PHP没有eval(),那么可能会以(相对)简单的方式进行直接PHP->编译的二进制翻译。但由于PHP本身可以通过eval()动态地动态构建/执行脚本,因此不可能执行全功能二进制。任何二进制文件都必须包含整个PHP,因为编译器不知道你的动态代码可以做什么。你会从一个小的1或2k脚本转换成一个巨大的数兆字节的二进制文件。

+0

thx回复!假设我不使用eval(),并且解决了动态构造的问题(在另一个线程中获得了关于编译器和动态构造的另一个问题,我在原始问题下发布了这个问题作为注释),那么它会是高效地编译? – blacktie24

+0

我不知道'高效',但不明白为什么它不可能。 –