PHP不使用操作码的标准机制。 我希望它坚持一个堆栈VM(Python,Java)或注册虚拟机(x86,perl6等)。 但它使用的东西绝对是本土的,而且在于蹭。
它使用内存中的连接列表,导致每个操作码具有 – > op1 – > op2和 – >结果。 现在每一个都是常量或临时表中的条目等这些指针不能以任何理智的方式序列化。
现在,人们已经完成了使用像pecl / bcompiler这样的项目,它将stream转储到磁盘中。
但是这些类更加复杂,这意味着有可能的代码片段
if() { class XYZ() { } } else { class XYZ() { } } class ABC extends XYZ {}
这意味着只有在运行时才能完成大量关于类和函数的决定 – 像Java这样的东西会在两个同名的类中窒息,而这两个类是在运行时有条件地定义的。 基本上,APC的inheritance和类caching代码可能是代码库中最复杂和最容易出错的部分。 每当一个类被caching时,所有父inheritance的成员必须在保存到操作码caching之前被清理掉。
指针问题不是无法克服的。 有一个apc_bindump,我从来没有打算修复每当重新启动完成,直接从磁盘加载整个caching项。 但是debugging所有的东西仍然需要定位所有的系统指针是很痛苦的–apache的情况太简单了,因为所有的php进程都有相同的系统指针,因为fork的行为。 旧的fastcgi版本比较慢,因为他们以后先用fork&init php – php-fpm用相反的方法修复。
但最终,PHP中真正缺less的是发明字节码格式的意愿,抛弃当前引擎和所有模块 – 使用堆栈虚拟机重写它并构buildJIT。 我希望我有时间 – fb家伙几乎在他们的嘻哈HHVM。 其中牺牲eval()更快的performance – 这是一个公平的牺牲:)
PS:我是没有时间正确更新APC 5.4的人