facebook / hiphop-php
https://github.com/facebook/hiphop-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。
更多信息,可以申请加入HipHop的邮件列表:
http://groups.google.com/group/hiphop-php-dev
分享到:
相关推荐
Facebook面临上市最大挑战:贪婪和没有远见.docx
Facebook-FBUS-Facebook_Q3短评报告:电商之外再探搜索,隐私-14页.pdf
隐藏来自Facebook:trade_mark:聊天和朋友的Messenger的“已看到”功能。块传递收据... 现在你的朋友不会知道你是否阅读过他们的信息。 这个看不见的扩展: 阻止“已看到”功能 阻止“送达回执”功能 阻止“上次活动...
Facebook永不收费的原因:保持用户量 不差钱.docx
Facebook电子商务报告详文:转化率2%到4%.docx
区块链行业Facebook听证会深度解析:道阻且长,聚焦三大问题-0719-国盛证券-10页.pdf
★注意* Facebook:trade_mark:是Facebook:trade_mark:Inc.的注册商标。使用Facebook:trade_mark:商标名或商标是用于识别,参考或描述。 此扩展名与Facebook:trade_mark:Inc或其产品品牌无关。 此扩展绝对不使用任何...
Facebook-绘制前进道路:在线内容监莞(英文)-2020.7-22页精品报告2020.pdf
HipHop PHP:Facebook出品的PHP虚拟机,运行时和JIT
Facebook:trade_mark:是Facebook:trade_mark:Inc。的商标。此扩展名为“All Friends Remover”与Facebook:trade_mark:inc无关。 使用此扩展程序需要您自担风险。仔细删除您的Facebook:trade_mark:朋友。开发者不对...
Facebook SDK from Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中
此扩展名为“Fast Delete Facebook:trade_mark:Messages”,与Facebook:trade_mark:inc无关。 使用此扩展程序需要您自担风险 仔细删除您的邮件。 对于因此扩展程序删除邮件而导致的任何道德或物质损失,开发者不承担...
重要说明:Facebook:trade_mark:的Messenger&Notifier完全不属于官方Facebook或Messenger网站应用程序或网站,也不与之相关。 它基本上是一个非官方的扩展,它是独立开发和维护的。 官方www.messenger.com网站和...
增强Facebook:trade_mark:Livestream-增强并加快观看的Facebook Live流的速度,以实现缓慢的Internet连接。 增强Facebook:trade_mark:Livestream-增强并加快观看的Facebook Live流的速度,以实现缓慢的Internet连接...
“North Star Metric” 北极星指标。何为北极星指标,在纷繁的产品世界里该如何利用北极星指标来照耀着我们走到终点,杀出重围? “North Star Metric” 北极星指标,又叫做“OMTM” One metric that matters, 唯一...
这是由我开发的独立项目,与Facebook:trade_mark:或Facebook Inc没有任何关系。免责声明:此Chrome扩展程序与适用于Facebook的Color Changer有关,并且与流行的社交网站Facebook没有任何隶属关系。 所有版权属于其...
Facebook没有 足够的Facebook :cross_mark: ! 富有成效 :red_heart: :light_bulb: 下载:
从Facebook:trade_mark:上的内容中删除广告和用户互动跟踪 请在以下网址报告错误:https://github.com/mgziminsky/FacebookTrackingRemoval/issues从Facebook:trade_mark:上的内容中删除广告和用户交互跟踪。 修改后...
Facebook的React动画 使用React和FramerMotion制作的Facebook Reaction动画。 演示: : :wrench: 使用的工具 :victory_hand: 贡献 太好了!克隆并设置本地项目后,您可以将更改推送到github fork并发出请求请求。...