經過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官網也提供了一份向下相容性問題的詳細說明。