php語言

當前位置 /首頁/計算機/php語言/列表

瞭解PHP7的革新與效能優化

PHP 7.0被號稱為新一代的PHP,官方直接跳過了php 6版本(為什麼跳過PHP6),將在2015年10月釋出。他的重要特性主要體現在效能方面,據稱效能實現跨越式的大幅提升。

瞭解PHP7的革新與效能優化

官方開發組對Zend引擎底層做了大量優化來提升PHP的效能。開發者聲稱其效能兩倍於PHP 5。對PHP 7.0 RC2的測試顯示, 這一說法是精確的,其實還是保守估計。評測結果顯示:PHP 7.0的速度是PHP 5.3~5.6的2~2.5倍,同時佔用的記憶體更少。這次PHP7的革新一定會給Web服務帶來更深刻的變化,它已經接近Facebook開發的PHP執行引擎HHVM,後者通過將PHP程式碼動態翻譯成原生機器碼而大幅提高速度。

  除了效能的優化外,其中最值得一提的就是JIT了。

Just In Time(即時編譯)是一種軟體優化技術,指在執行時才會去編譯位元組碼為機器碼。從直覺出發,我們都很容易認為,機器碼是計算機能夠直接識別和執行的,比起Zend讀取opcode逐條執行效率會更高。其中,HHVM(HipHop Virtual Machine,HHVM是一個Facebook開源的PHP虛擬機器)就採用JIT,讓他們的PHP效能測試提升了一個數量級,放出一個令人震驚的測試結果,也讓我們直觀地認為JIT是一項點石成金的強大技術。

在PHP5.5的程式碼裡,因為並沒有明顯型別定義,只能靠型別推斷。儘可能將可以推斷出來的變數型別,定義出來,然後,結合型別推斷,將非該型別的分支程式碼去掉,生成直接可執行的機器碼。然而,型別推斷不能推斷出全部型別,在WordPress中,能夠推斷出來的型別資訊只有不到30%,能夠減少的分支程式碼有限。導致JIT以後,直接生成機器碼,生成的ByteCodes太大,最終引起CPU快取命中大幅度下降(CPU Cache Miss)。通過JIT,可以降低VM的開銷,同時,通過指令優化,可以間接降低記憶體管理的開發,因為可以減少記憶體分配的次數。然而,對於真實的WordPress專案來說,CPU耗時只有25%在VM上,主要的問題和瓶頸實際上並不在VM上。

特別需要大家知道的是:做為業內知名的線上平臺《慕課網》也已經發布了最新的PHP7.0新特性詳解課程( Rango主講)

PHP 7.0.0 RC 1 現已提供下載(),Windows 原始碼和二進位制提供在( )。

  新增特性和改變

  1. 純量型別和返回型別宣告(Scalar Type Declarations & Scalar Type Declarations)

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

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

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

  3. AST(Abstract Syntax Tree,抽象語法樹)

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

  4. Native TLS(Native Thread local storage,原生執行緒本地儲存)

PHP在多執行緒模式下(例如,Web伺服器Apache的woker和event模式,就是多執行緒),需要解決“執行緒安全”(TS,Thread Safe)的問題,因為執行緒是共享程序的記憶體空間的,所以每個執行緒本身需要通過某種方式,構建私有的空間來儲存自己的私有資料,避免和其他執行緒相互汙染。而PHP5採用的方式,就是維護一個全域性大陣列,為每一個執行緒分配一份獨立的儲存空間,執行緒通過各自擁有的key值來訪問這個全域性資料組。

而這個獨有的key值在PHP5中需要傳遞給每一個需要用到全域性變數的函式,PHP7認為這種傳遞的方式並不友好,並且存在一些問題。因而,嘗試採用一個全域性的執行緒特定變數來儲存這個key值。

TAG標籤:優化 PHP7 革新 #