编程效率高是PHP语言最大的特色,可是做为脚本语言,一直存在着CPU和内存使用效率不高的问题,直到HipHop for PHP的出现。Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序,一个从新实现的PHP运行库,和许多经常使用PHP扩展的重写版本构成,目的是旨在加速和优化 PHP。前端
用Facebook官方博客(没法直接访问)上项目负责人赵海平(北大1987届遗传与分子生物专业,普林斯顿计算机科学博士)的话 说,HipHop项目对Facebook影响巨大。它目前已经支撑了Facebook 90%的Web流量。因为HipHop,Facebook Web服务器上的CPU使用平均减小了50%,从而大大减小了服务器的需求。为了让这一改进也惠及社区,他们决定将之开源,但愿可以进一步帮助提升更多大 型复杂PHP网站的可伸缩性。编程
PHP和Facebook的问题后端
众所周知,Facebook的前端主要是用PHP写的。赵海平说,过去六年Facebook从PHP语言的进展上获益良多。PHP很是简单,易学易用,好读好调试,所以新工程师成长很快,有利地促进了Facebook的更快的创新。缓存
PHP是一种脚本语言,其好处是编程效率高,可以支持产品的快速迭代。可是与传统的编译语言相比,脚本语言的CPU和内存使用效率很差。随着 Ajax技术的普遍采用,加上SNS对动态要求较高,这些缺点更显得突出。对于每个月超过4000亿次PV的Facebook来讲,如何实现扩展,尤为具备 挑战性。服务器
常见的办法是直接用C++重写PHP应用中比较复杂的部分,做为PHP扩展。实际上,PHP就转变为一种胶水语言,链接前端HTML和C++应用逻 辑。从技术角度讲这也没有问题,可是增长了技能需求,可以在整个应用上工做的工程师数量就大大减小了。学习C++只是编写PHP扩展的第一步,接下来还要 理解Zend API。因为Facebook的工程团队较小,每一个工程师要支持100万以上的用户。有些代码不是团队里每一个人都能看懂,这对于Facebook是没法接 受的。函数
Facebook网站自己的可伸缩性更具挑战性,由于几乎每次页面浏览都是有个性化体验的登陆用户发起。浏览主页 时,系统须要查询全部朋友、朋友最重要的状态更新、 根据隐私设置筛选结果,而后还要显示评论、照片等等动态,这一切都须要在一秒内完成。性能
自2007年以来,Facebook曾写过几种不一样办法解决这些问题。其中包括用另外一种语言重写Facebook,可是因为开发的复杂性和速度等原 因,未能实现。他们还重写了PHP的核心部分Zend引擎,并提交给了PHP项目,但最终仍是没有得到所需的性能。最后,他们选择了HipHop,终于得 偿所愿。单元测试
有了HipHop,工程师能够编写代码,用PHP编写组合最后页面的逻辑,并可以继续快速迭代,同时后端服务使用C++, Erlang, Java, Py thon编写,提供新闻提要、搜索、聊天和其余核心功能。学习
HipHop开发故事测试
赵海平透露,项目最初是来自几年前Facebook公司一次Hackathon活动(员工在一个晚上自由发挥,实验新的想法),他手工将PHP转换 为C++代码,虽然语法上很相似,可是不管是CPU仍是内存使用,转换后的C++代码都大大优于PHP。因而他想,若是构建一个系统,编程实现转换,会怎 么样呢?
在此以前,已经有了很多改善PHP性能的方法。Zend引擎在运行时转换PHP源代码为运行在Zend虚拟机上的opcode。开源项目APC和 eAccelerator将输出缓存,为大多数PHP网站所使用。此外,还有Zend Server这样的商业产品,经过opcode优化和缓存,提升PHP速度。赵海平选择了另外一条道路,将PHP直接转为C++,而后再变成本地机器码。当 然,有许多开源项目也是一样的思路,Roadsend和phc编译为C,Quercus编译为Java,而Phalanger编译为.NET。
Hackathon以后8个月,赵海平拿出了原型,足以说明这条路能够走通,编译后的代码的确更快。不久,Iain Proctor和Minghui Yang加入进来。接下来又开发了10个月,在生产服务器上测试了6个月。而后正式上线部署,6个月以后,Facebook 90%以上的Web流量都使用了HipHop。
按赵海平的说法,凭借HipHop,Facebook Web服务器上的CPU使用平均减小了50%,从而大大减小了服务器的需求。项目对Facebook影响巨大。为了让这一改进也惠及社区,他们决定将之开源,但愿可以进一步帮助提升更多大型复杂PHP网站的可伸缩性。
HipHop的原理
HipHop将PHP代码转换为高度优化的C++代码,而后再用g++编译器编译。它能够保持语义等效地执行源代码,但为了提升性能,牺牲了一些不多用到的特性,好比eval()。
HipHop开发中的主要困难在于,在PHP和C++这两种很不同的语言之间怎么实现转换。虽然PHP也能够写一些很巧妙的动态特性,可是大多数 PHP代码仍是很是简单的。if (...) {...} else {..} 比foo($x) { include $x; } 确定更常见。这为性能提升提供了机会。HipHop生成的代码尽量地使用函数和变量的静态绑定。同时,还使用类型推演来选出变量最可能对应的某个类型, 从而节省内存。转换过程分三步:
1. 静态分析。收集声明关系和依赖关系等信息。
2. 类型推演。选择最合适的类型,是C++的标量?仍是String, Array, classes, Object或者Variant。
3. 代码生成。大部分直接将PHP语句和表达式对应为C++的语句和表达式。
在开发过程当中,还有一个副产品:HPHPi,是一个实验性的解释器。经过它,不编译PHP源代码也能够运行。它已经用于HipHop自身的调试中。 HipHop在保持了PHP优势的同时,也兼得了C++的性能优点。项目总共有30万行代码,5000多个单元测试。全部这些都将以PHP开源许可证形式 发布到GitHub。