虽然最近 PHP 核心开发的重点一直集中在新的语言特性上,但近年来越来越多的关注集中在性能上。虽然这对许多用户来说已经足够了,但随着 PHP 被维基百科和 Facebook 等大型网站使用,在更少的服务器上处理更多请求的能力变得越来越重要。在过去的几年里,PHP内部团队内部和外部都在这方面做出了一些努力。然而,要准确了解正在发生的事情,需要一些历史和概念的背景知识。
虽然最近 PHP 核心开发的重点一直集中在新的语言特性上,但近年来越来越多的关注集中在性能上。虽然这对许多用户来说已经足够了,但随着 PHP 被维基百科和 Facebook 等大型网站使用,在更少的服务器上处理更多请求的能力变得越来越重要。
在过去的几年里,PHP内部团队内部和外部都在这方面做出了一些努力。然而,要准确了解正在发生的事情,需要一些历史和概念的背景知识。
PHP的起源
1994 年,拉斯穆斯·勒多夫 (Rasmus Lerdorf) 想要一种更简单的方式向互联网用户展示他的简历并监控其流量。当时,Web 开发是通过用 C 编写 CGI 程序来完成的,这可能很乏味,并且需要了解许多低级概念,例如手动内存管理。于是,Rasmus 开始研究后来的 PHP。
要真正理解这个想法在当时是多么新颖,需要了解一些概念。你以前可能听说过计算机在一和零上工作,这是二进制数系统的组成部分。计算机处理器在此基础上建立一组数字指令,统称为汇编语言,可以转换为二进制。这些指令仅限于相当简单的操作,例如将两个数字相加。
编译器,如 C 编译器 Rasmus 用来构建 PHP,通过接受用高级语言编写的代码并将其转换为特定处理器的二进制文件来构建 PHP。这些工具使编程语言更易于人类阅读,这反过来又允许用比汇编所需的更少的代码完成更复杂的任务,并使相同的代码能够为具有不同指令集的多个处理器编译。
PHP本身有些不同:它是一种解释型语言,而不是像C语言那样的编译语言。PHP 解释器不是编译程序,而是为服务器的特定处理器编译,该解释器执行程序。这个抽象层的优点是让你在不编译PHP代码的情况下运行它。同样的能力被吹捧为Java的一个优势,一年后的1995年,Java出现了“一次编写,随处运行”的短语。
不过,口译语言并非没有成本。编译后的程序运行速度更快,因为它们作为处理器可以直接理解的指令存在。解释器必须从根本上将处理器硬件的功能实现为软件。例如,PHP 解释器将 PHP 代码转换为操作码(相当于汇编),并执行它们。因此,解释器通常被称为虚拟机;与用于在主机操作系统内运行客户机操作系统的(系统)虚拟机一样,它们是抽象中的抽象,提供便利以换取性能。就 PHP 而言,Zend 引擎(PHP 4 中的 1.0,PHP 5 中的 2.0)是它的虚拟机。这就是我们故事的开始。
它会编译吗?
一个名叫 Paul Biggar 的人决定用 PHP 来探索这个问题。他于 2006 年加入 phc 项目,目标是能够将 PHP 翻译成等效的 C 代码,然后将其编译为本机代码等。它的发展今天仍在继续,尽管发布不是很频繁。
在Paul开始努力后不久,在2007年初,Roadsend以pcc的名义开始了一个具有类似目标的项目,后来改为rphp或Roadsend PHP。然而,在撰写本文时,该项目已经有大约一年的时间没有提交过了。它的支持论坛仍然偶尔会看到帖子,但大多数都表明与 Roadsend 合作相当麻烦。该项目的 IRC 频道也显示为非活动状态。
其他项目将某种形式的PHP移植到类似的平台上:Phalanger在.NET CLR上运行它,Quercus和Project Zero在Java JVM上运行它。这些项目至少在某种程度上仍然活跃。但是,与 phc 和 rphp 不同的是,它们将源代码编译为需要执行运行时库的字节码,而不是处理器可以直接执行的本机代码。
增强 PHP 性能
在 2008 年初,RFC 的原始特征为 RFC 标准和流程铺平了道路,后来被 PHP 内部团队采用。两年后,PHP内部团队的两名成员Dmitry Stogov和Stanislav “Stas” Malyshev提交了一份提案,概述了Zend引擎中高达20%的潜在性能改进,该提案后来得到了实施。同年,PHP 5.3 发布,其中包括从 flex 词法分析器到 re2c 的切换,这也导致了性能的轻微改进。很明显,PHP的性能已经不仅仅是一个学术问题。
进入嘻哈
Facebook 在 2010 年 2 月中旬宣布了他们的计划,将整体响应能力提高两倍。大约在同一时间,他们宣布发布 HipHop for PHP,这是一个目标类似于 phc 和 rphp 的项目。HipHop 将 PHP 代码转换为 C++ 代码,然后由 g++ 编译器编译。在此之前,Facebook对APC扩展和Zend引擎做出了许多性能增强的贡献,而HipHop似乎是Facebook继续使用PHP并维护其大量现有PHP代码库的合乎逻辑的下一步。
实现 HipHop 需要牺牲 PHP 的一些更动态的功能,比如支持,以及重新实现 PHP 的运行时并重写它的几个扩展。但是,它消除了开发人员使用C或C++的需要,并处理此类语言编写编译代码的乏味。事实上,Facebook 声称在将 HipHop 部署到他们的服务器后,CPU 使用率下降了 50%。eval()
该项目在最初发布时引发了 PHP 社区成员的一些意见,包括 PHPUnit 的首席开发人员 Sebastian Bergmann;David Coallier,PEAR总裁兼echolibre首席技术官;以及 Mozilla 的开发人员 Brandon Savage。总体而言,它的反响是积极的,该项目的开发仍在继续。Facebook 与 PHP 社区中的几个热门项目合作,包括 Drupal 和 WordPress,帮助他们使用 HipHop 不支持的动态功能删除代码,并修复在尝试在 HipHop 上部署这些项目时发现的错误。他们还在不断提高性能,甚至达到实现更有效的内存分配的程度。
新虚拟机
最近,Facebook发布了HipHop虚拟机(hhvm),它得到了Ars Technica和ReadWriteWeb等多个来源的报道。hhvm 模糊了编译器和虚拟机(如 Zend 引擎)之间的界限。
hhvm 就是所谓的 Just-In-Time(或 JIT)编译器。hhvm 不是通过 C++ 编译阶段将 PHP 转换为原生代码,而是将 PHP 转换为称为 HipHop 字节码 (HHBC) 的中间字节码语言,可以在需要时实时转换为原生代码。
hhvm 旨在替代将静态编译的基于 HipHop 的二进制文件部署到生产环境。在初始版本发布时,hhvm 提供了 60% 的整体相对性能提升。
结语
正是用户和社区成员推动了PHP及其架构的创新发展。Facebook只是为PHP的持续成功做出贡献的众多公司之一。他们不仅为原始项目贡献了更改,还向社区提供了自己的 PHP 工作,并与其他 PHP 项目合作,使他们能够利用 HipHop 等项目。
事实上,PHP 从 1995 年不起眼的开始已经走了很长一段路。虽然 HipHop 可能不适合所有项目或所有服务器,但它可以为大型项目提供性能增强,并帮助他们大幅降低操作硬件要求。这绝对是一个值得你关注的项目,也是PHP生态系统活力的证明。
发表评论 取消回复