Facebook HipHop
PHP 是现在网络最常用的脚本语言,最大的特点是编程效率高,能够支持产品的快速迭代,Facebook的HipHop项目使PHP语言 优化了CPU和内存使用效率。
项目负责人赵海平(北大1987届遗传与分子生物专业,普林斯顿计算机科学博士)
编程效率高是PHP语言最大的特点,但脚本语言CPU和内存使用效率不高,HipHop for PHP出现了。
HipHop for PHP把PHP到C++的转换程序,重新实现的PHP运行库,和许多常用PHP扩展的重写版本构成,目的是旨在加速和优化PHP
HipHop项目对Facebook影响巨大,支撑了Facebook 90%的Web流量
由于HipHop,Facebook Web服务器上的CPU使用平均减少了50%,大大减少了服务器的需求。
为了让这一改进也惠及社区,他们决定将之开源,希望能够进一步帮助提高更多大型复杂PHP网站的可伸缩性。
PHP和Facebook的问题
Facebook的前端主要是用PHP写的,Facebook从PHP语言的进展上获益良多。PHP非常简单,易学易用,好读好调试,因此新工程师成长很快,有利地促进了项目的更快的创新。
随着Ajax技术的广泛采用,加上SNS对动态要求较高,CPU和内存使用效率不高的缺点更显得突出。
对于每月超过4000亿次PV的Facebook来说,如何实现扩展,尤其具有挑战性。
直接用C++重写PHP应用中复杂的部分,作为PHP扩展,把PHP转为胶水语言,连接前端HTML和C++应用逻辑。
技术角度讲没有问题,但增加了技能需求,能够在整个应用上工作的工程师数量就大大减少了。
学习C++只是编写PHP扩展的第一步,接下来还要理解Zend API。
由于Facebook的工程团队较小,每个工程师要支持100万以上的用户。有些代码不是团队里每个人都能看懂,这对于Facebook是无法接受的。
Facebook网站本身的可伸缩性更具挑战性,因为几乎每次页面浏览都是有个性化体验的登录用户发起。
浏览主页 时,系统需要查询所有朋友、朋友最重要的状态更新、 根据隐私设置筛选结果,然后还要显示评论、照片等等动态,都要在一秒内完成
有了HipHop,工程师可以编写代码,用PHP编写组合最后页面的逻辑,继续快速迭代,同时后端服务使用C++, Erlang, Java, Py thon编写,提供新闻提要、搜索、聊天和其他核心功能
改善PHP性能的方法
1.Zend引擎在运行时转换PHP源代码为运行在Zend虚拟机上的opcode
2.开源项目APC和eAccelerator将输出缓存,为大多数PHP网站所使用
3.Zend Server 商业产品,opcode优化和缓存,提高PHP速度
4.将PHP直接转为C++,然后再变成本地机器码
5.Roadsend和phc编译为C,
6.Quercus编译为Java,
7.Phalanger编译为.NET
Facebook 90%以上的Web流量都使用了HipHop
HipHop开源目的
能够进一步 帮助网络上大型复杂PHP网站 提高网站的可伸缩性。
HipHop的原理
HipHop将PHP代码转换为高度优化的C++代码,再用g++编译器编译,它可以保持语义等效地执行源代码,但为了提高性能,牺牲了很少用到的特性,比如eval()
HipHop生成的代码尽可能地使用函数和变量的静态绑定。还使用类型推演来选出变量最可能对应的某个类型,从而节省内存
转换过程三步
1. 静态分析。收集声明关系和依赖关系等信息。
2. 类型推演。选择最合适的类型,是C++的标量?还是String, Array, classes, Object或者Variant。
3. 代码生成。大部分直接将PHP语句和表达式对应为C++的语句和表达式。
在开发过程中,还有一个副产品:HPHPi,是一个实验性的解释器。
通过HPHPi不编译PHP源代码也可以运行。它已经用于HipHop自身的调试中。HipHop在保持了PHP优点的同时,也兼得了C++的性能优势。
项目总共有30万行代码,5000多个单元测试
Facebook已将该HipHop虚拟机开源,源代码发布在GitHub上
https://github.com/facebook/hiphop-php/