当我们仔细看Facebook大多数页面的URL时,会看到一些以.php后缀结尾的页面。那是因为Facebook很大程度上依靠PHP这个脚本语言来开发自己大部分面向Web的页面。因为PHP的流行程度和极其容易上手的特性使公司的开发人员能用它很快的为其网站构建新的功能。
但是像Facebook这样的网站每月都有千亿次的访问,PHP在性能上的缺乏使Facebook应对这样的问题时遇上了瓶颈。因此Facebook一直大力致力于在PHP在性能方面的改善,使其精简,快速更有效率。他们在这个方向的努力有了成效,他们最新开发出的技术:HipHop VM(HHVM), 一个能够显著提高PHP加载动态页面性能的虚拟机。更值得称道的是,Facebook把这个技术开源与世人共享。
刚开始时,让Facebook提升性能的工作主要集中在调整著名的Zend引擎上,通过提高引擎对Facebook的兼容性(包括对引擎上的问题进行修复及打补丁)以及编写基于C++的PHP扩展来减缓程序的应用逻辑在运行时所造成的繁重负载。
然而,在去年的时候,Facebook高级软件工程师Haiping Zhao在Facebook开发者博客上发了一个帖子,认为按这样的努力方向会因为要求开发者精通基于C++的Zend API而分割大量开发资源,耗费大量的时间。因为Facebook希望保持尽可能多的工程师继续做PHP开发,公司也没有看到通过调整修改Zend引擎来达到开发者所期望的性能提升。
因此,Facebook团队开始寻求除Zend之外的选择方向。在2010年,公司把所有精力集中在开发一种程序解释器:HPHP,或称作”HipHop“,它是一种通过将PHP脚本代码先转换成抽象语法树(AST)(这样PHP代码可被结构化,使分析和遍历它变得很容易),而后再转换成被优化的C++代码。
将PHP转化成较低级语言并不是一个新概念,譬如Roadsend,将PHP转换成C并编译。而将PHP代码转化成C++可以让Facebook更好更容易的整合那些定制的,已经用C++写的后台服务。Hiphop几乎将Facebook代码的运行速度提升了一倍,在很多情况下,Facebook服务器的利用率也对应减半。它的出现对其他的PHP产品来说也同样受益,譬如Wordpress,在其性能基准测试中发现性能也提升了一倍。
但是,在开发HipHop中也有以下这些问题。. 其中一个问题就是,Facebook在开发和测试他们的代码时可能不再使用标准的PHP解释器。因为HipHop还没有完全实现涵盖PHP的每一个层面(虽然他们说“HipHop支持PHP5.3中的大部分特性”)。
也有在PHP里被支持的一些独特的特性已经在HipHop里被实现—但是很多并被没有被很好的记录下来或者根本没有文档记录。所以用一个标准的PHP环境去调试HipHop几乎毫无意义—因为它将不会发现那些从PHP转换到C++过程时可能发生的错误。 Facebook 软件工程师 Minghui Yang 在他10月一篇博客: “使HPHPi快些“ 提到: ”老的PHP解释器不在适用于我们的PHP代码, Facebook开发者现在需要代码调试后能立即看到结果的解释器”。
为了使调试代码更加容易,Facebook工程师开发了自己的PHP解释器,HPHPi,这是一种能够很好匹配PHP代码转换及编译行为的解释器。然而不幸的是,尽管工程师尽力提升其性能,HPHPi依旧运行得很慢。前Facebook软件工程师Evan Priestly在Quora中的一篇帖子提到,”HPHPi要比PHP差不多慢上一倍”。除此之外,当HPHPi通过AST来分析PHP代码时,会在编译中出错,并且实现不了像在HipHop里生成C++这样的功能。
在将那些通过解释器把动态语言(比如PHP)转化成静态被编译过的语言时, Facebook也遇到了一些限制。比如变量,数据类型及函数在PHP中工作方式各不相同,因为他们是在脚本运行时才被分配调用,而非在被具体编写时,所以,一些Facebook应用的元素在被静态编译后并不能很好地运行起来。
以上这些问题就是创造HHVM(HipHop虚拟机)的出发点的。HHVM使用同样的AST技术作为HipHop的编译器,然而不同的是,在转换后,它生成的是一种字节码而非C++代码。 和Java或C#不同,HipHop并没有采用动静态结合的”即时编译”方式,它采用trace-based translation来逐条分析脚本中的每一个循环语句,风格上有点像Mozilla为编译Javascript而开发的编译器TraceMonkey。被HHVM虚拟机翻译后所生成的字节码会随后被一个实时解释器所执行。
HHVM现在仍处于开发阶段,目前的进度差不多是完成了90%,根据Facebook软件工程师Jason Evans的话来说,HHVM解释器的速度已经比HPHPi快60%了,快到已足以让Facebook将其所有产品转移到VM平台上作开发。
然而,和编译过的代码相比,它的速度仍不及后者的四分之一,Facebook正在解决静态语言转换相关的问题以便能更容易地维护代码,并希望最终能让其所有产品的代码在HipHop VM上运行。同时,HHVM的代码,和之前的HipHop一样,已经在PHP和Zend的认证下开源,并公开发表在GitHub上。
原文链接: Facebook looks to fix PHP performance with HipHop virtual machine
——————————————————————————————————————————–