用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。