经过10年的漫长等待,PHP 7终于正式问世了。这个影响全球8成网站的开发语言,一举从5.0版,跳过了功败垂成的6.0版,一举进入了7.0时代
资料来源:W3Techs.com,iThome整理制图,2015年12月
这个版本,PHP开发者们足足等了10年。
继2004年的PHP 5之后,PHP官网终于发布了磨剑10年的PHP 7.0新版本。这是189位开源开发者,花了两年时间,送出超过1万次程式码更新,才完成的新版本。
20年前初夏,1995年6月8日,一位爱解决问题的C语言软体工程师,苦于不知如何用C来做一个自己的个人首页。因为在网页开发技术刚起步的这个时候,没有人提供出C语言版的网页开发环境。
他索性决定自己来写一个,并命名为Personal Home Page Tools,简称PHP Tool。这就是日后用来开发出Facebook、Yahoo等全球2亿多个网站的PHP语言最初的版本。而这位开发者,就是日后扬名开发界的PHP之父Rasmus Lerdorf。
PHP随着网际网路从1996年开始起飞,也迅速成为开发人员打造网站的首选技术。
2008年,光在臺湾每4个网站就有一个採用PHP
PHP语言一路跟着作业系统,从32位元架构开始跨入64位元,在2004年推出的PHP 5更是一个体质大改造的版本,顺利地跨入了物件导向架构的世界,稳坐网站开发技术龙头。即使微软打着容易上手为号召,以ASP网站开发技术抢攻市场,PHP仍是许多网站开发者心目中的首选。2008年时,光在臺湾,每4个网站,至少有1个是採用PHP开发。
不过,在快速进化的IT世界中,越早出现的技术,往往也背负了越重的转型包袱。
2005年时,PHP在Unicode的支援过程上,重重摔了一跤。Unicode支援原本要成为PHP 6的主打特色,但在开发社群中对多国语言支援的争论,和PHP效能议题的质疑,衍生出了漫长的拉扯论战,也延宕了PHP 6的发展,甚至PHP 5.3的小改版都抢先在2009年支援了PHP 6的大部分功能(除了Unicode支援外),隔年春天,PHP 6计画正式宣告失败而终止,也让PHP技术的发展,蒙上了一层阴霾。
全球2.4亿个网站后端开发语言是PHP
PHP 5持续改版推陈出新,但总是处于一种小改小修的优化,而鲜有从根本上革新的大进步。尽管语言进展缓慢,但PHP的影响力却是持续不坠,甚至越来越大,2013年初,根据Netcraft网站统计,全球超过2.4亿个网站的后端开发语言用的就是PHP。
PHP之父Rasmus Lerdorf今年5月来臺演讲时透露,Facebook为了自家网站速度而重新改写了PHP编译引擎的JIT作法,引起了PHP开发者对于PHP语言效能的再思考,也促使PHP 7的问世。(图片来源/iThome)
脸书JIT优化作法促发了PHP重构计画
Rasmus Lerdorf今年5月来臺演讲时透露,Facebook为了自家网站速度而重新改写了PHP编译引擎的JIT作法,引起了PHP开发者对于PHP语言效能的再思考。
2014年,开始有一群PHP开发者(包括了来自中国现任职于链家网的惠新宸)展开PHP语言的重构,也就是PHP NG专案(PHP New Generation),为了提高效能,他们不惜重新检视甚至改写PHP语言原始码,一试结果发现,PHP程式的效能大幅提升了30%。
旧版PHP语言的发展目标是希望尽可能地提供更多功能,来满足任何网站开发的需求,但新的PHP 7,则是希望兼顾效能和功能。Rasmus Lerdorf这样说。
但要对一个已经发展了10年,歷经了全球开源开发人员精心雕琢之后的开发语言,还想要找出很大效能突破的关键,不是一件容易的事。
也因此,PHP 5重构专案PHP NG的巨大成效,也获得PHP开发社群支持,成了PHP 7的基础,开发社群转而细细地推敲每一行PHP程式码,想办法从各种地方找出效能优化的关键。
PHP核心开发团队花了很多心力来缩减PHP程式执行时所需搬动的记忆体位元数,像是将PHP储存变数的资料架构zval从24位元缩减至16位元。或是重新检视CPU层级的程式码运作过程,来确保PHP 7程式码更能符合新一代的处理器架构。
以zval优化来说,Rasmus Lerdorf曾解释,因为zval是用来储存变数的PHP内部的C语言基础资料结构,不论是整数、长整数、双精度浮点数、浮点数、阵列及物件都会储存在zval数值。
原本在PHP 5中zval所用的容量大小是76 位元组,但到了PHP 7,则将zval容量缩减为52位元组,Rasmus Lerdorf表示,这意味着,建立PHP 7的基本资料结构缩减了24 位元组,PHP程式「每次要搬动的资料单位变小了,所以可以执行得更快,这是其中一个关键改变。」Rasmus Lerdorf表示。
不过,Rasmus Lerdorf也强调,每一次修改的优化可能只改善不到0.5%的效能,但经过了数百次如此这样斟酌推敲的成果,累积起来就让PHP 7的效能足足比旧版提高了一倍。
尽管从PHP 5升级到7也不是一件容易的事,但对全球2亿个用PHP开发的网站而言,PHP 7无疑是一个解决既有网站效能瓶颈的新救星。
PHP新版12项新特色
除了效能提升之外, PHP 7其他新特色如大幅减少了记忆体使用,抽象化语法树、一致性的64位元支援、例外处理架构优化、将致命错误(fatal error)转为例外处理、强化乱数产生器的安全性、移除旧式SAPI和例外处理,增加了null-coalescing操作符「??」、宣告方式上则新增了Return和Scaler型别,另外也增加了Anonymous Classes、Zero cost asserts等新特色。
PHP原始程式码除了可在GitHub上取得,官网也提供了一个下载网址,而Windows环境的PHP 7执行档下载网页则是windows.php.net/download
不过,有不少PHP 7功能没有向下相容,例如在PHP 5中的致命错误(fatal errors),在PHP 7中改成异常(exceptions)处理机制,因此一些旧有错误事件唿叫机制会失效。或像是foreach指令不再能更新阵列内部指标、list()函数不能反向分派数值、global不再支援可变变数等。PHP官网也提供了一份向下相容性问题的详细说明。