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性能大提升的秘密:HipHop相关推荐

  1. win10提升性能的服务器,Win10性能大提升,这些设置让你的电脑直接起飞

    原标题:Win10性能大提升,这些设置让你的电脑直接起飞 大家有没有发现电脑有时总会莫名的卡顿,而且明明也没有打开太多软件,可是运行还是很慢. 在不考虑更换硬件设备的前提下, Win10 一些软件和硬 ...

  2. Python 3.11 终于发布了,性能大提升!

    来源:https://realpython.com/python311-new-features 推荐阅读:终于来了,[第三期] 彭涛Python 爬虫特训营!! 终于,Python 3.11 正式版 ...

  3. iPhone 13 终于等到了!降价、新颜色、电池续航性能大提升

    整理 | 禾木木.苏宓 出品 | AI科技大本营(ID:rgznai100) 它来了,真的来了! 不知有多少朋友守在今日凌晨观看一年一度的科技春晚--苹果发布会! 还是那个熟悉的样子,从加利福尼亚的沙 ...

  4. chrome 历史版本_2020 年最后一次更新,Chrome 性能大提升的新版本来了

    11 月 18 日凌晨,Google 正式发布 Chrome 87,作为计划中 2020 最后的一次更新,Google 不仅在这个版本中为我们带来了一些实用的功能改进,此前一直在测试的性能提升和能耗优 ...

  5. win10计算机性能选项在哪,Win10性能大提升,这些设置让你的电脑直接起飞

    大家有没有发现电脑有时总会莫名的卡顿,而且明明也没有打开太多软件,可是运行还是很慢. 在不考虑更换硬件设备的前提下, Win10 一些软件和硬件的简单调整,也可以使我们电脑性能提升,运行更快. 下面就 ...

  6. node 升级_技术周刊( Node.js 12 性能大提升 2019-04-30)

    前端快爆 Node.js 12 发布,该版本带来了巨大的性能提升.V8 升级到 7.4 带来了诸多新特性,比如 Private Class Fields.Array#{flat,flatMap} 等: ...

  7. gpio 树莓派3a+_树莓派4正式发布!硬件性能大提升:CPU提升3倍,支持USB3.0、蓝牙5.0、千兆以太网、4G LPDDR4、H.265...

    树莓派(Raspberry Pi)基金会,6月24日正式发布了Raspberry Pi 4 Model B. 树莓派是全球知名的基本计算微型电脑,深受全球开发者.编程者.极客等人士的追捧和喜爱. 这一 ...

  8. 纸壳CMS 3.0升级.Net Core 2.1性能大提升

    微软发布了.Net Core 2.1正式版,纸壳CMS也在第一时间做了升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新功能. Gitee https://gitee ...

  9. win10性能选项让计算机,Win10性能大提升,这些设置让你的电脑直接起飞

    想要减少延迟提高系统性能,就必须给硬件加满电力,选择高性能计划. 方法:在设置-电源与睡眠-其他电源设置中,选择高性能. 02 . 禁用视觉效果 Win10 中的动画和过渡效果,虽然不会对电脑速度造成 ...

最新文章

  1. 超实用 Linux下通过VNC安装Oracle
  2. python opencv转换bytesio
  3. Error - section 'InterruptVectorLow' can not fit the absolute section. Section 'InterruptVectorLow'
  4. 【一秒打开】如何提高IDEA、vscode的开启速度
  5. 【嵌入式】C语言高级编程-语句表达式(03)
  6. 十问十答 CDDL 许可证
  7. C++ open 打开文件
  8. 字符编码详解及由来(UNICODE,UTF-8,GBK)
  9. 【lee】关于团队之间交流的一些意见和建议
  10. paroot忘记root密码
  11. 解决Could not find artifact com.oracle:ojdbc7:pom:12.1.0.2 的方案
  12. [c++] WINAPI
  13. Ubuntu18.04 U盘安装和分区方案
  14. 谷歌生物医学专用翻译_需要外文文献翻译助攻?收下这几个神器!
  15. 互联网下半场的基本玩法
  16. 【EXCEL分列小技巧:按特殊符号分列】
  17. 7-4 打印九九口诀表 (15 分)
  18. 决策树-ID3与C4.5
  19. B. Pleasant Pairs
  20. 《2018人工智能芯片技术白皮书》发布

热门文章

  1. 进程创建函数fork()和vfork()
  2. ubuntu + oepncv + PCL + realsenseSDK + ROS + OpenVino开发环境搭建
  3. tf.squeeze示例代码
  4. 机器学习—决策树构造算法的python实现
  5. 吴恩达卷积神经网络课程——第一周笔记
  6. 关联规则挖掘算法_#数据挖掘初体验 使用weka做关联规则
  7. PCL特征点与配准(1)
  8. 【亲测可用→防止入坑Routes】设置angular10项目异步加载、惰性加载、懒加载路由
  9. 在Ubuntu 14.04 64位上使用libpcap进行抓包和解包
  10. Linux 下获取本机所有网卡 以及 网卡对应ip 列表