PHP 是传统意义上的解释型语言,而不是编译型语言。

因此,在命令行或 Web 服务器调用解释器解释 PHP 代码之前,PHP 代码就是 PHP 代码。PHP 解释器会解释 PHP 脚本,把代码转换为一系列 Zend 操作码(机器码指令,http://php.net/manual/internals2.opcodes.php),再把这些操作码交给 Zend Engine 执行。不过,解释型语言执行的速度比编译型语言慢很多,因为每次执行解释型语言编写的代码时都需要将其转换为机器码,消耗额外的系统资源。Facebook 意识到了这个性能瓶颈,与 2010 年开始开发一个叫 HPHPc 的编译器,把 PHP 代码编译成 C++ 代码。

HPHPc 编译器先把 PHP 代码编译成 C++ 代码,再把 C++ 代码编译成可执行文件,最后把这个可执行文件部署到生产服务器HPHPc 基本上是成功的,它提升了 Facebook 的性能,降低了 Facebook 服务器 的负担。可是,HPHPc 对性能的提升已经到极限了,而且不能完全兼容 PHP 语言,还需要额外话时间编译,因此对开发者来说,反馈回路太长。Facebook 需要一种混合解决方案,既要进一步提升性能,又要让开发速度更快,省去编译代码的时间。

于是,Facebook 开始开发下一步 HPhpc,即 HHVMHHVM 先把 PHP 代码转换成一种字节码中间格式,而且会缓存转换得到字节码,然后使用 JIT 编译器转换并优化缓存的字节码,将其变成 x86_64 机器码。HHVM 的 JIT 编译器提供了很多底层性能优化措施,这些优化措施是把 PHP 代码直接编译成 C++ 代码的 HPHPc 所不具备的。HHVM 才会及时把字节码编译成机器码,这一点和传统的解释型语言很像。2012年10约,HHVM 的性能超过了 HPHPc,而且仍在不断提升。

HHVM 的性能超越 HPHPc 之后不久,HPHPc 就被废弃了。现在,Facebook 的首选 PHP 解释器是 HHVM。

注意:

  • HHVM 的实现可能很负责,可是说到底,HHVM 只不过是我们属性的 PHP 和 PHP-FPM 二进制文件的替代品:
  • 我们在命令行使用 HHVM 二进制文件执行 PHP 脚本,就像 PHP 二进制文件一样。
  • 我们使用 HHVM 二进制文件创建 FastCGI 服务器,就像 PHP-FPM 二进制文件一样。
  • HHVM 原生执行很多常用的 PHP 扩展。

HVVM 适合我使用吗?

HVVM 并不是适合所有人使用。提升性能有更容易的方式,例如,减少 HTTP 请求数和优化数据库查询都是易于实现的方式,能显著提升应用的性能,减少响应时间。如果你还没使用这些优化措施,考虑使用 HHVM 之前先做这些优化吧。Facebook 的 HHVM 是为已经做了这些优化措施之后仍想进一步加速应用的开发者准备的。如果你觉得自己需要 HHVM,可以参考以下资源:

查看 HHVM 兼容的 PHP 扩展

Facebook 对 PHP 的改进的更多相关文章

  1. Facebook工程师是如何改进他们Android客户端的

    from://http://greenrobot.me/devnews/facebook-engineer-improve-android-app/ Facebook工程师是如何改进他们Android ...

  2. 【安卓开发】Facebook工程师是如何改进他们Android客户端的

    原文出处: Facebook   译文出处:penkzhou   欢迎分享原创到伯乐头条 作为世界上最大的社交网络,Facebook的Android客户端面临着各种各样的使用环境(地理环境.Andro ...

  3. Hadoop的分布式架构改进与应用

    1.  背景介绍 谈到分布式系统,就不得不提到Google的三驾马车:GFS[1],MapReduce[2]和BigTable[3]. 虽然Google没有开源这三个技术的实现源码,但是基于这三篇开源 ...

  4. HBase运维经验

    http://www.qconbeijing.com/download/Nicolas.pdf 重点看了下facebook做了哪些改进以及他们的运维经验,比较重要的有以下几点: 改进: 1 加强了行级 ...

  5. 39、apk瘦身(转载)

    本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用 ...

  6. Mcrouter-基于Memcached协议的缓存层流量管理工具(Memcached集群的另一个选择)(转)

    Mcrouter 是一个基于Memcached协议的路由器,它是 Facebook缓存架构的核心组件,在峰值的时候,它能够处理每秒50亿次的请求.近日,Facebook开放了Mcrouter的源代码, ...

  7. Facebook对MySQL全表扫描性能的改进

    原文博客如下: http://yoshinorimatsunobu.blogspot.com/2013/10/making-full-table-scan-10x-faster-in.html 如下是 ...

  8. [转]以Facebook为案例剖析科技公司应有的工具文化

    原文:http://36kr.com/p/146507.html 这是一篇几年前的文章,但对于没有涉及到工具文化这个概念的人来说,还是很新的. 前言 前段时间和大众点评的 CEO 张涛聊天的时候碰到内 ...

  9. fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

    [Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件 ...

随机推荐

  1. k8s安装之etcd备份还原yaml

    etcd备份还原方案,这种比较高级. 使用docker,自动化处理. 如果单节点备份,ETCD_ENDPOINTS一个即可. 如果多节点恢复,依次执行恢复脚本即可. apiVersion: batch ...

  2. .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性

    了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...

  3. 什么是好的产品——Diet Rams的十大设计原则

    博朗(BRAUN)的首席设计师Diet Rams的十大设计原则 第一条,好的产品是有创意的,它必须是一个创新的东西: 第二条,好的产品是有用的,一定要对人有用: 第三条,好的产品是优美的,它必须有美感 ...

  4. vue创建组件的方式

    一.直接通过Vue.extend的方式创建组件 // 通过vue.extend 来创建全局组件 var com1 = Vue.extend({ template:'<h3>这是h3组件&l ...

  5. SP10707 COT2 - Count on a tree II 莫队上树

    题意:求一条链 \((u,v)\) 上不同的颜色数. 我们可以求出树的出栈入栈序(or 括号序?我也不确定). 图(from attack) 然后有一个很优美的性质: 设点 \(u\) 的入栈时间为 ...

  6. javascript之大文件分段上传、断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  7. CSS字体图标

    一.什么是字体图标: 1. 字体图标可以和图片一样改变透明度,旋转度,等等 2.本质是文字,可以改变大小颜色等等比较适用于移动端 总结;图标字体具有矢量效果,放大缩小不失真,而且可以使用CSS任意更改 ...

  8. c函数指针和指针函数如何使用何定义;如何调用使用

    #include <stdio.h> int * sum(int x); //声明一个 指针函数 返回类型位一个指针变量 可以通过*p来获取值 int (*pfun)(int,int);/ ...

  9. 19、Executor原理剖析与源码分析

    一.原理图解 二.源码分析 1.Executor注册机制 worker中为Application启动的executor,实际上是启动了这个CoarseGrainedExecutorBackend进程: ...

  10. 【一起来烧脑】一步React.JS学会体系

    [外链图片转存失败(img-cn4fbVDq-1563575047348)(https://upload-images.jianshu.io/upload_images/11158618-8c6f3d ...