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

Android必备:Android的体系结构
2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/107.html 最近一个月接触Android,开始做一些app的开发,通过参考网络上的资料,阅读Android相关的书籍,从无知到了解&…

豆瓣评分 9.4 的算法巨著,这本书带无数读者入门算法
说到算法巨著,你可能想到的是《算法导论》这本经典。但在入门算法时,还有一本与之比肩的巨著,不得不提,它就是《算法(第4版)》。这本豆瓣评分 9.4 的算法巨著,可谓是算法经典好书,给…

zabbix企业应用之监控oracle
本次介绍如何使用zabbix监控oracle,主要使用pyora这个python脚本来监控,具体地址可以参考https://github.com/bicofino/Pyora 我的zabbix版本为2.0.6,oracle为11g 下面是部分效果图 1、Oracle/Active user count 2、Oracle/Bytes sent and re…

ZendFramework的介绍、安装和实例运行
框架主要是为了提高开发效率、使得团队开发人员之间的更容易沟通和协作以及提高应用程序的可维护性。学习了解一种或多种框架对实际项目的应用会有所帮助。一、ZendFramework 的介绍:ZendFramework(以下简称:ZF),以 Model-View-Controller(MV…
input type=hidden /在IE中占空间(转)
input 的 type 设为 hidden 的话,就是隐藏域(废话)。隐藏域在页面中不显示,但可以有值。既然是“隐藏”的,怎么还说会占空间呢。这是 IE 的 bug,不过这个 bug 的出现需要一定的条件,换句话说就是…

网友:Java岗,自学一个月跳槽计算机视觉,其实入门很简单
笔者在脉脉上看到一条帖子:原来Java岗,自学一个月成功跳槽视觉算法岗。这已经不是笔者第一次看到转行成功的程序员案例了,而大家的跳槽动机基本上都离不开,发展趋势、岗位高薪、职业兴趣。计算机视觉行业真相:竞争压力…

MapReduce对交易日志进行排序的Demo(MR的二次排序)
1.日志源文件 (各个列分别是: 账户,营业额,花费,日期) zhangsan163.com 6000 0 2014-02-20 lisi163.com 2000 0 2014-02-20 lisi163.com 0 100 2014-02-20 zhangsan163.com 3000 0 2014-02-20 wangwu126.com 9000 0 2014-02-20 w…

HTTP中Get与Post的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而…

sdut AOE网上的关键路径(spfa+前向星)
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid2498&cid1304 题目描述 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。 AOE(Activity On Edge)网:顾名思义,用边表示活动的网ÿ…

苹果新功能惹网友众怒,还有隐私可言吗?
编译 | 禾木木出品 | AI科技大本营(ID:rgznai100)大部分人选择 iPhone 的一大理由就是信息安全,这家公司对于个人隐私的保护一直为人称赞。最近苹果公司宣布,为了让儿童能够更加安全地上网,他们决定在iOS 15、iPADOS 15、macOS Monterey系统中…

让Ubuntu拥有SUSE一样的GRUB启动界面
SUSE的漂亮大家可能都见识过,尤其是那个Grub启动画面。我身边的朋友为了在自己的系统上也能使用SUSE的GRUB启动画面,用了一种原理比较简 单,过程比较白痴的方法:先安装SUSE,把/boot单独分区,然后把除了/boo…

计算机编程简史图
计算机编程简史图www.21kaiyun.com 21世纪开运网 算准你每天的桃花运 帮忙推广下我的网站 谢谢

HTML5 模板推荐
http://www.yundic.com/转载于:https://www.cnblogs.com/lsl8966/p/4133484.html

Windows 11 再惹“众怒”!网友:微软就是逼我去买新电脑!
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一般来说,不论是移动还是桌面操作系统,如若要升级版本,大多用户都不会产生过大的抵触情绪,毕竟更新往往都是为了确保用户获得最佳体验。但近来用户对微软…

刚学习了linux的DHCP 配置.呵呵.自己上来总结下.
先来看DHCP的工作原理.DHCP (Dynamic Host Configuration Protocol)下面的部分是google找的....~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DHCP来自ITwiki,开放的信息技术大百科DHCP是Dynamic Host Configuration Protocol的…

App_Offline.htm 一个静态页面实现整站维护时统一页面
在ASP.NET 2.0 站点根目录下,只要存在 App_Offline.htm 文件,那么所有对.aspx的请求都将转向App_Offline.htm 。而且浏览器的地址栏显示的是所请求的.aspx的URL。 这样当我们的站点需要维护时,只要把App_Offline.htm 拷贝到站点根目录下即…

C++编程思想重点笔记(上)
C和C指针的最重要的区别在于:C是一种类型要求更强的语言。就void *而言,这一点表现得更加突出。C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现。例如: bird* b;rock* r;void* v;v r;b v; C不允许…

一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择
作者:天元浪子来源:CSDN 博客市面上的录屏工具软件有很多,基本都是窗口程序。毕竟,离开GUI的支持,设置参数、选择录像区域等操作都会变得非常困难。不过,窗口程序也并非无往不胜,即便是屏幕录像…

SMO学习笔记(二)——还原(恢复)篇之完整恢复
SQLSERVER2005恢复介绍: 三种恢复模式(一).简单恢复模式 事务日志被自动截断,不能使用日志文件进行恢复。(二).完整恢复模式 保留所有操作的完整事务日志。(三).大容量日志恢复模式 简要记录大容量操作(索引创建和大容…

linux内核map图
linux内核map图

Linux下tcpdump用法
根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供了and、 or、not等逻 辑语句来帮助过滤不必要的信息; 默认情况下&#…

终于有人站出来为程序员说话了
【CSDN 编者按】刘少山博士是《程序员》杂志的作者之一,多年来投稿了大量无人驾驶领域相关的优质内容,《新程序员》上线后,他带着自己多年来对技术行业的思考以及对程序员群体的殷切期望重新回归,希望能对大家有所启迪。作者 | 刘…

给 Windows 驱动程序安装提速
对比各种主流操作系统,在 Windows 上安装驱动程序是最直观最方便的,不仅可以通过设备管理器查看所有硬件的信息并安装驱动,在有新硬件插入时也有人性化的驱动程序安装提示和安装向导,甚至还可以在线安装驱动,这都是其他…

web标准化设计:常用的CSS命名规则
常用的CSS命名规则 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:left right center 登录条ÿ…

鲲鹏应用创新大赛山西区域赛圆满落幕,鲲鹏生态助力信创变革
鲲鹏入晋,万里腾飞,8 月 6 日,2021 鲲鹏应用创新大赛山西赛区决赛在太原圆满落幕。今年鲲鹏应用创新大赛区域赛山西赛区是山西省内数字化转型的重要赛事,经过层层选拔,共 35 个队伍进入山西赛区决赛,参加政…

视频分享网站首页:最新视频特效
2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE> <html> <head><title></title><style>.newVideo{width:208px;height:116px;border:0px solid #000; position:relative;cursor:pointer;}.newVideoImg{position:relativ…

Metasploit攻击Oracle的环境搭建
Metasploit中关于Oracle的攻击模块默认并不完全,需要自己做一些工作。本文主要记录在搭建环境的中的一些错误(操作系统Backtrack 5)。在默认情况下使用oracle的一些攻击功能会出现类似如下错误:ary module execution completed m…

jQuery / jQuery mvc plugin
jMVC专为 Qt WRT 设计。Qt WRT 将随新版Qt发布,支持 Symbian ^3 和 Meego 设备。jMVC 采用延迟加载设计,代码分布在不同的.js文件中,调用时通过xhr加载。 在web环境中会严重影响性能,所以jMVC不适合开发web site。目前大部分web b…

【转发】什么时候该用委托,为什么要用委托,委托有什么好处
好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处.... 看完下面的文章你将茅塞顿开..(看不懂的直接TDDTDS) 概念虽然我不喜欢讲太多 我们直接先来YY 个场景:我很喜欢打游戏,但运气不好每次打游戏都会被主管看到,朱老板不喜欢他的员工在上班的时 间打游戏,所以朱…

一位合格软件工程师应该具备怎样的工程化、交付能力?
大厂待遇高、福利也好相信很多同学都对大厂有着向往,然而现实却是......有的同学成功拿到offer进入大厂,有的同学还在为备考大厂迷茫苦恼着:我之前从未面试过,这次冒险投了字节,几乎是抱着积累经验和技术交流的心态去了…