导致Facebook需要在PHP之外使用C ++的主要原因是什么?我想知道我是否要创建一个有很多访问者的网站,我也需要使用C ++吗?
导致Facebook需要在PHP之外使用C ++的主要原因是什么?我想知道我是否要创建一个有很多访问者的网站,我也需要使用C ++吗?
Answers:
原因如下:适用于PHP的HipHop:快速移动:
Facebook的主要价值之一就是快速行动。在过去的六年中,由于PHP提供了快速的开发步伐,我们已经取得了很多成就。作为一种编程语言,PHP很简单。简单易学,易于编写,易于阅读和调试。使用PHP可以比使用其他语言更快地在Facebook上招聘新工程师,从而可以更快地进行创新。
今天,我很高兴能与一个很棒的人组成的小团队分享这个项目,并且我过去两年一直在努力。适用于PHP的HipHop。使用HipHop,根据页面的不同,我们平均将Web服务器上的CPU使用率降低了约50%。更少的CPU意味着更少的服务器,这意味着更少的开销。这个项目对Facebook产生了巨大的影响。我们认为,整个Web都可以从HipHop中受益,因此,我们今晚将其作为开源发布,希望它将新的关注点转向使用PHP扩展大型复杂网站。虽然HipHop向我们展示了令人难以置信的结果,但它肯定还不完整,在试用之前,您应该对Beta软件感到满意。
从技术上讲,HipHop for PHP本身并不是编译器。而是它是源代码转换器。HipHop以编程方式将您的PHP源代码转换为高度优化的C ++,然后使用g ++对其进行编译。HipHop以语义等效的方式执行源代码,并牺牲了一些很少使用的功能(例如eval()),以换取更高的性能。HipHop包括代码转换器,PHP运行时系统的重新实现以及许多常用PHP扩展的重写,以利用这些性能优化。
将PHP扩展为脚本语言
PHP的根源是脚本语言的根源,例如Perl,Python和Ruby,它们在程序员的生产力和快速迭代产品的能力方面均具有重大优势。这与更传统的编译语言(如C ++)和解释型语言(如Java)相比。另一方面,已知脚本语言在CPU和内存使用方面通常效率较低。因此,将Facebook扩展到每月超过4000亿个基于PHP的页面浏览量一直是一个挑战。
解决这些低效率问题的一种常用方法是直接在C ++中将PHP应用程序的更复杂部分重写为PHP扩展。这在很大程度上将PHP转换为前端HTML和C ++中的应用程序逻辑之间的粘合语言。从技术角度来看,这很好,但可以大大减少能够在整个应用程序上工作的工程师的数量。学习C ++只是编写PHP扩展的第一步,其次是了解Zend API。鉴于我们的工程团队相对较小(每位工程师有超过一百万的用户),我们无法让我们的代码库中的某些部分比其他部分更难以访问。
扩展Facebook尤其具有挑战性,因为几乎每个页面视图都是具有自定义体验的登录用户。当您查看主页时,我们需要查找所有朋友,查询他们最相关的更新(通过我们构建的名为Multifeed的自定义服务),根据您的隐私设置过滤结果,然后在故事中添加评论,照片,喜欢和所有人们喜欢的关于Facebook的丰富数据。所有这些都在不到一秒钟的时间内。HipHop允许我们用PHP编写完成最终页面汇编的逻辑,并快速迭代该逻辑,同时依靠C ++,Erlang,Java或Python中的自定义后端服务来服务新闻提要,搜索,聊天和其他核心部分该网站。
自2007年以来,我们一直在考虑解决这些问题的几种不同方法,甚至尝试实施其中一些方法。通常的建议是只用另一种语言重写Facebook,但是鉴于网站的复杂性和开发速度,这将需要一些时间才能完成。我们已经重写了Zend Engine的各个方面(PHP的内部结构),并将这些修补程序重新贡献给了PHP项目,但最终没有看到所需的性能提高。HipHop的收益对我们的发展速度几乎是透明的。
黑客HipHop
几年前的一个晚上,在Hackathon上的一个晚上(请参阅Prime Time Hack),我开始了我的第一段代码,将PHP转换为C ++。这些语言在语法上非常相似,并且在CPU和内存使用方面,C ++大大优于PHP。甚至PHP本身也是用C编写的。我们知道不可能成功地手工重写整个这种大小的代码库,但是想知道如果我们构建一个系统来以编程方式进行操作会发生什么情况。
寻找提高PHP性能的新方法并不是一个新概念。在运行时,Zend Engine将您的PHP源代码转换为操作码,然后再通过Zend虚拟机运行。开源项目(例如APC和eAccelerator)将缓存此输出,并且大多数PHP支持的网站都使用该项目。还有Zend Server,这是一种商业产品,可通过操作码优化和缓存使PHP更快。相反,我们正在考虑将PHP源代码直接转换为C ++,然后可以将其转换为本地机器代码。甚至编译PHP也不是一个新主意,Roadsend和phc等开源项目将PHP编译为C,Quercus将PHP编译为Java,而Phalanger将PHP编译为.Net。
不用说,它花费的时间比那场Hackathon还要长。八个月后,我有足够的代码来演示使用编译后的代码确实可以更快地运行。我们迅速将Iain Proctor和Mingming Yang加入团队,以加快项目进度。在接下来的十个月中,我们完成了所有编码,并在接下来的六个月中对生产服务器进行了测试。我们很自豪地说,目前,在部署之后仅六个月,我们就使用HipHop满足了90%的Web流量。
嘻哈如何运作
该项目的主要挑战是弥合PHP和C ++之间的鸿沟。PHP是一种脚本语言,具有动态弱类型。C ++是具有静态类型的编译语言。虽然PHP允许您编写神奇的动态功能,但是大多数PHP相对简单。您看到的
if (...) {...} else {..}
比 看到的更有可能function foo($x) { include $x; }
。这就是我们提高性能的地方。只要有可能,我们生成的代码都会对函数和变量使用静态绑定。我们还使用类型推断为变量选择最具体的类型,从而节省内存。转换过程包括三个主要步骤:
- 静态分析,我们收集有关谁声明什么和依赖项的信息,
- 类型推断,我们在C ++标量,字符串,数组,类,对象和变量之间选择最具体的类型,以及
- 代码生成大部分是从PHP语句和表达式到C ++语句和表达式的直接对应。
我们还开发了HPHPi,这是为开发而设计的实验性解释器。使用HPHPi时,无需在运行之前编译PHP源代码。它帮助我们发现了HipHop本身的错误,并为工程师提供了一种使用HipHop的方式,而无需更改他们编写PHP的方式。
总体而言,HipHop使我们能够保留PHP的最佳方面,同时利用C ++的性能优势。总共,我们已经编写了300,000行代码和5,000多个单元测试。
简短的回答-不,您不需要 C ++。
我相信您指的是HipHop。如果您了解它所提供的改进,则大约为50%。如果您是拥有数千个前端服务器的Facebook,那么这非常重要。减少它们的负载意味着节省数百万的数据中心成本。如果公司拥有10-100台前端服务器,那么开发成本将大大超过可能的节省。无论如何,最繁重的处理是在后端完成的,通常是一些RDBMS或NoSQL解决方案,是作为高度优化的C / C ++代码开发的。
当然,仅将PHP完全转储就可以节省更多的钱。但这并不是庞大的代码库所能实现的,例如Facebook。
现在,对于问题的其他部分:如果您真的想知道如何处理巨大的负载,请阅读High Scalability博客,尤其是Real Life Architectures部分。
PHP可以实现,但绝对不是我的选择。如果您需要动态语言,Python,Ruby或Lua会是更好的选择。