程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP7革新與性能優化(1)

PHP7革新與性能優化(1)

編輯:關於PHP編程

PHP7革新與性能優化(1)


有幸參與2015年的PHP技術峰會PHPCON),聽了鳥哥惠新宸)的關於PHP7的新特性和性能優化的分享,一切都令人感 到激動。鳥哥是國內最權威的PHP專家,他的分享有很多非常有價值的東西,我通過整理分享的PPT和收集相關資料,整理為這篇解讀性質的技術文章,希望能 給做PHP開發的同學一些幫助。

PHP已經走過了20年的歷史,直到今天,PHP7都發布了RC版,據說,PHP7正式版應該會在2015年11月份左右發布。PHP7對於上一個系列的PHP5.*,可以說是一個大規模的革新,尤其是在性能方面實現跨越式的大幅提升。

PHP是一種在全球范圍內被廣泛使用的Web開發語言,PHP7的革新也當然會給這些Web服務帶來更深刻的變化。這裡引用鳥哥PPT中的一個圖表82%的Web站點有使用PHP作為開發語言):

php7-features-1

注:一個web站點可以會使用多種語言作為它的開發語言)

注:本文含有不少從鳥哥PPT裡的截圖,圖片版權歸鳥哥所有)

我們先看看兩張激動人心的性能測試結果圖:

Benchmark對比圖片來自於PPT):

php7-features-2

PHP7的性能測試結果,性能壓測結果,耗時從2.991下降到1.186,大幅度下降60%。

WordPress的QPS壓測圖片來自於PPT):

php7-features-3

而在WordPress項目中,PHP7對比PHP5.6,QPS提升2.77倍。

看完令人激動的性能測試結果對比,我們就進入正題哈。PHP7的新增特性很多,不過,我們會更聚焦於那些主要的變化。

一、新增特性和改變

1. 標量類型和返回類型聲明Scalar Type Declarations & Scalar Type Declarations)

PHP語言一個非常重要的特點就是“弱類型”,它讓PHP的程序變得非常容易編寫,新手接觸PHP能夠快速上手,不過,它也伴隨著一些爭議。支持變 量類型的定義,可以說是革新性質的變化,PHP開始以可選的方式支持類型定義。除此之外,還引入了一個開關指令 declare(strict_type=1);,當這個指令一旦開啟,將會強制當前文件下的程序遵循嚴格的函數傳參類型和返回類型。

例如一個add函數加上類型定義,可以寫成這樣:

php7-features-4

如果配合強制類型開關指令,則可以變為這樣:

php7-features-5

如果不開啟strict_type,PHP將會嘗試幫你轉換成要求的類型,而開啟之後,會改變PHP就不再做類型轉換,類型不匹配就會拋出錯誤。對於喜歡“強類型”語言的同學來說,這是一大福音。

更為詳細的介紹:PHP7標量類型聲明RFC[翻譯]  

2. 更多的Error變為可捕獲的Exception

PHP7實現了一個全局的throwable接口,原來的Exception和部分Error都實現了這個接口interface), 以接口的 方式定義了異常的繼承結構。於是,PHP7中更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error,如果捕獲就變 為一個可在程序內處理的Exception。這些可被捕獲的Error通常都是不會對程序造成致命傷害的Error,例如函數不存。PHP7進一步方便開 發者處理,讓開發者對程序的掌控能力更強。因為在默認情況下,Error會直接導致程序中斷,而PHP7則提供捕獲並且處理的能力,讓程序繼續執行下去, 為程序員提供更靈活的選擇。

例如,執行一個我們不確定是否存在的函數,PHP5兼容的做法是在函數被調用之前追加的判斷function_exist,而PHP7則支持捕獲Exception的處理方式。

如下圖中的例子截圖來源於PPT內):

php7-features-6

3. ASTAbstract Syntax Tree,抽象語法樹)

AST在PHP編譯過程作為一個中間件的角色,替換原來直接從解釋器吐出opcode的方式,讓解釋器parser)和編譯器compliler)解耦,可以減少一些Hack代碼,同時,讓實現更容易理解和可維護。

PHP5:

php7-features-7

PHP7:

php7-features-8

更多AST信息:https://wiki.php.net/rfc/abstract_syntax_tree

4. Native TLSNative Thread local storage,原生線程本地存儲)

PHP在多線程模式下例如,Web服務器Apache的woker和event模式,就是多線程),需要解決“線程安全” TS,Thread Safe)的問題,因為線程是共享進程的內存空間的,所以每個線程本身需要通過某種方式,構建私有的空間來保存自己的私有數據,避 免和其他線程相互污染。而PHP5采用的方式,就是維護一個全局大數組,為每一個線程分配一份獨立的存儲空間,線程通過各自擁有的key值來訪問這個全局 數據組。

而這個獨有的key值在PHP5中需要傳遞給每一個需要用到全局變量的函數,PHP7認為這種傳遞的方式並不友好,並且存在一些問題。因而,嘗試采用一個全局的線程特定變量來保存這個key值。

相關的Native TLS問題:https://wiki.php.net/rfc/native-tls

5. 其他新特性

PHP7新特性和變化不少,我們這裡並不全部展開來細說哈。

… …




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved