前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP小白要知道:PHP7 性能为何能翻倍的关键因素是什么

PHP小白要知道:PHP7 性能为何能翻倍的关键因素是什么

作者头像
沈唁
发布2018-05-24 16:07:09
3.7K0
发布2018-05-24 16:07:09
举报
文章被收录于专栏:沈唁志沈唁志

2017 年 02 月 17 日,PHP 7.1.2 发布。PHP7 是 PHP 编程语言的一个主要版本,并号称是开发 Web 应用程序的一次革命,可开发和交付移动企业和云应用。此版本被认为是 PHP 在 2004 年发布 PHP5 后最重要的变化。最大特色是在性能上的大突破,能比前一版 PHP 5 快上一倍,PHP 之父Rasmus Lerdorf表示,甚至能比 facebook(纯 PHP 开发的世界级大型网站)的 HHVM 虚拟机下的 PHP 程序性能更快。

HHVM 是 FaceBook 为自家网站特性而量身客制的 PHP 优化机制,不见得适用任何网站。但Rasmus Lerdorf表示,PHP7 的目标之一就是要让任何网站开发者,就连使用开发框架 Drupal、开源电子商务系统 Opencart 时,都能有不输使用 HHVM 技术的性能。

一个 20 年来历经了多次改版和无数次优化的成熟语言,还能有性能提高一倍的突破绝非易事,Rasmus Lerdorf坦言,不像一般新项目多半容易找出许多改进空间,新版 PHP 并非修改部分程序就达到了如此的成果。反而是,透过大量细节优化和性能累加 后,PHP 7 才具备了不输 HHVM 的执行性能。

Rasmus Lerdorf 与 PHP 核心贡献团队花了许多心力减少程序运作时搬动的内存位数,由此加速执行的性能。例如,PHP 中储存变量的数据架构 zval 从 24 位 缩减至 16 位、Hashtable 从 72 位减少至 56 位,并检视 PHP 中的函式,思考有无任何改进性能的空间。

除了从减少内存的使用着手外,Rasmus Lerdorf 更检视 CPU 的 Cache line 的运作原理,了解程序代码如何与 CPU 互动、编译程序如何在新 CPU 架构下编译程序代码等细节,确保 PHP 7 的程序代码符合现代 CPU 的架构。虽然每个项目的优化对性能贡献都低于 0.5%,但由于优化的项目很多,或是某项改善的功能会被应用程序反复呼叫,整体修正的综效结果就能有如此大的进展。

受 HHVM 刺激,Rasmus Lerdorf 决定打造兼具性能与功能的 PHP。Facebook 为了优化 PHP 运作,搭配 JIT 编译而打造出虚拟机 HHVM。而 HHVM 虽然拥有快速 的执行性能,其为特定用途优化的设计,只能满足小部分的开发者。反之,Rasmus Lerdorf 除了想提升 PHP 的性能表现外,也想要同时满足高端使用者以及业余使用者的需求,让 PHP 7 成为兼备性能表现及通用功能的程序语言。

然而,开发符合市场上少部分人使用的程序语言并不是难事,但是 PHP 项目瞄准许多对象,必须同时符合业余使用者及专业开发者需求的原则下,开发难以面面俱 到,因为总是会有部分族群的需求无法被满足,「这就像拿水管大范围的喷洒,而每个人衣服都会被水沾湿一点,但是不会有人的衣服完全湿透。」Rasmus Lerdorf 比喻。

不使用外挂框架的 PHP 的运算性能表现都很优异,但是受到外加框架的影响,原本可以在数秒内处理上千个网页要求的 PHP,性能大幅下降,变为只能处理数十 个要求。Rasmus Lerdorf 表示,在 HHVM 出现之前,相较于对 PHP 性能表现的要求,使用者比较在意 PHP 能否降低网页开发的难度,而这些框架能让开发者的工作变得 比较简单。但是在 Facebook 推出 HHVM 后,引出许多重视 PHP 性能表现的使用者,让 Rasmus Lerdorf 意识到许多使用者有性能表现的需求。他开始思考如何将 HHVM 的 JIT 架构与 PHP 融合。

但 Rasmus Lerdorf 表示,PHP 与 HHVM 两者在架构设计上相当不同,例如,HHVM 的多线程架构并不是很稳固。此外,HHVM 的可移植性并不佳,离可以在 Windows 平台上运作还有很大一段路,而 PHP 有很多开发者在 Windows 环境开发,而 HHVM 无法照顾到那些使用者。

Rasmus Lerdorf 表示,他不能放弃 PHP 的主要架构,虽然他们曾经考虑过融合两者,但是,HHVM 在使用上有很多的限制。虽然 HHVM 对 Facebook 及 许多开发者是非常好的工具,但对于 PHP 项目来说,HHVM 的使用范畴还不够宽广,只能符合 Facebook 或是 Wikipedia 等特定项目的需求。

非强型别语言的 PHP,导入 JIT 是难上加难。然而,在 PHP 中加入 JIT 编译是件非常困难的事情。Rasmus Lerdorf 表示,JIT 必须学会辨认程序的运作模(Patterns),例如了解哪些部份为重要的程序代码,并且在程序运作前,预测程序被呼叫的时 机,或是哪些部分的程序会呼叫。

Rasmus Lerdorf 比喻,在许多汽车中,JIT 必须能预测哪部分的车子会右转、哪部分的车子会左转或是某些颜色汽车会直行,「而 JIT 必须要全部预测正确,否则性能会大大的降低。」但是,如果预测正确,程序执行性能则会大大提升。

在一般的程序语言的编译中加入 JIT 已属不易,Rasmus Lerdorf 表示,由于 PHP 的动态属性(dynamic)让加入 JIT 是难上加难。他举例,开发者宣告参数$a 值为 1,但不代表程序所有的$ a 的值都为 1,由于 PHP 中参数值可以很轻易地重新定义。在 C 语言中,当开发者宣告参数 a 为整数,则 a 永远为整数。如果程序中有任何地方宣告 a 是整数以外 的类型,连编译都无法执行。而因为 C 语言此种强型别的程序语言,「JIT 可以预测变量 a 为整数,但是在 PHP 中,我们没有这种奢侈。」他解释,HHVM 的 做法为当 JIT 得知 a 是整数型别后,则假设 a 永远为整数。

而 HHVM 为了在使用 JIT 编译,某种程度上受限了 PHP 的发展。HHVM 的用户必须清楚宣告变量的性质,但是使用 PHP 的开发者,可以先宣告没有性质的 类别(Class),后续再指定类别的变量属性。「在没有任何限制下,将 JIT 加入 PHP 是我们要做的事。」他表示,PHP 必须顾及 WordPress、 Drupal 等框架的开发者,不能任意停止对此些框架的支持。故与 HHVM 相比,PHP 在打造 JIT 的条件限制更多。

但是,「这不代表我们不能做 JIT。此外,我们也要控制 PHP 的发展走向。」Rasmus Lerdorf 表示。

目前,PHP 核心贡献者之一的 Dmitry Stogov 开发一个原型 JIT,并且使用某些实验性的应用程序去测试运作。Rasmus Lerdorf 表示,如果将此 JIT 用于执行某些重复性的运算或是循环程序,得以让 PHP 7 性能又再快上 10 倍。

不过他也坦承,当此实验性的 JIT 用于 WordPress 时,并未得到任何加速效果,「我们想要打造的 JIT 不是要在大学课本上学到的东西,而是能在真实 世界中运作的 JIT。」他表示。因为 PHP 一直都抱持如此的理想,试图解决人们生活中的问题,并且能真实世界中在线环境中运作,而不只是存在课本中的理 论。

Rasmus Lerdorf 表示,在 PHP 刚问世时,他每天至少花 16 个小时开发 PHP。但目前他已经逐渐减少投入开发,转而投注心力在世界各地宣传及演讲。他打趣地 表示:「与其自己开发,不如激励远比我聪明,又愿意一天花十八小时写程序的人去开发 PHP。」他表示,他的最终目标是 PHP 中没有任何一行由他所撰写的程 序代码,「任何在成长中的项目都不应该由一个开发者主导,老旧的程序代码应该被新的程序代码替换。」而他认为,其他开发者应该以此为目标。

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:PHP小白要知道:PHP7 性能为何能翻倍的关键因素是什么

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档