PHP是什麼-PHP的架構及原理概述

麥索發表於2018-02-25

記得我剛開始學習PHP的時候,許多面試官會經常問我PHP是什麼,那時的標準回答是PHP是一種弱型別動態指令碼程式語言,開源,免費,是超文字前處理器的縮寫。

這只是很淺的解釋,PHP對我來說是一個工具,是我手裡的一把錘子,雖然這把錘子時常被調侃為兩邊都是起釘器的錘子。

PHP是什麼-PHP的架構及原理概述

PHP 的特點

多程式模型

PHP是以多程式模型設計的,這樣的好處是請求之間互不干涉,一個請求失敗也不會對其他程式造成影響,作為最開始僅僅用於個人網站的一個工具集這樣的設計並沒有什麼不妥,隨著PHP的應用變大,訪問量增加這種方式顯然是不合適的,因為啟動一個程式的開銷對於海量請求是不划算的,所以現在PHP基本都是執行在PHP-FPM的管理下的,這是一個PHP程式管理器,它常駐記憶體啟動一些PHP程式待命,當請求進入時分配一個程式進行處理,PHP程式處理完畢後回收程式,但並不銷燬程式,這讓PHP也能應對高流量的訪問請求。

當然現在也有PHP多執行緒的解決方案和基於協程的解決方案讓PHP更高效的處理WEB請求。

弱型別

與 JAVA、C/C++ 不同,PHP是一門若型別的語言,變數在宣告的那一刻是不需要確定它的型別的,而在執行時型別也會發生顯式或隱式的型別改變,這也是PHP開發應用迅速、方便的原因之一。

其他

Zend 引擎 + Ext 擴充套件 的模式降低了內部耦合,可以方便的為PHP本身增加功能和去除功能。

語法簡單,沒有太多強制規範,程式設計風格上既可以用過程式、也可以用物件導向的方式進行開發,當然函式式也可以。

PHP 的架構

PHP是什麼-PHP的架構及原理概述

以目前的 PHP 主流版本 PHP7 和 PHP5 來說架構是如上圖所示,主要有四層體系構成,從下到上依次是 Zend 引擎、Extensions 擴充套件、SAPI 介面、上層應用。

Zend 引擎

Zend 引擎是 PHP4 以後加入 PHP 的,是對原有PHP直譯器的重寫,整體使用 C 語言進行開發,也就是說可以把PHP理解成用C寫的一個程式語言軟體,引擎的作用是將PHP程式碼翻譯為一種叫opcode的中間語言,它類似於JAVA的ByteCode(位元組碼)。

引擎對PHP程式碼會執行四個步驟:

  1. 詞法分析 Scanning(Lexing),將 PHP 程式碼轉換為語言片段(Tokens)。
  2. 解析 Parsing, 將 Tokens 轉換成簡單而有意義的表示式。
  3. 編譯 Compilation,將表示式編譯成Opcode。
  4. 執行 Execution,順序執行Opcode,每次一條,以實現PHP程式碼所表達的功能。

APC、Opchche 這些擴充套件可以將Opcode快取以加速PHP應用的執行速度,使用它們就可以在請求再次來臨時省略前三步。

引擎也實現了基本的資料結構、記憶體分配及管理,提供了相應的API方法供外部呼叫。

Extensions 擴充套件

常見的內建函式、標準庫都是通過extension來實現的,這些叫做PHP的核心擴充套件,使用者也可以根據自己的要求安裝PHP的擴充套件。

SAPI

SAPI 是 Server Application Programming Interface 的縮寫,中文為服務端應用程式設計介面,它通過一系列鉤子函式使得PHP可以和外圍交換資料,SAPI 就是 PHP 和外部環境的代理器,它把外部環境抽象後,為內部的PHP提供一套固定的,統一的介面,使得 PHP 自身實現能夠不受錯綜複雜的外部環境影響,保持一定的獨立性。

通過 SAPI 的解耦,PHP 可以不再考慮如何針對不同應用進行相容,而應用本身也可以針對自己的特點實現不同的處理方式。

上層應用

程式設計師編寫的PHP程式,無論是 Web 應用還是 Cli 方式執行的應用都是上層應用,PHP 程式設計師主要工作就是編寫它們。

總結

這些東西如果你學習過 android 開發理解起來顯然更容易,因為android的架構和PHP的這種架構看起來很相似。當你理解這些後你就會理解為什麼PHP的創始人會說PHP開發其實是不需要框架的,因為PHP的設計本身就是一個類似框架的東西,如果用汽車比喻的話PHP本身就是就是車的骨架,Zend的是引擎,Ext是輪子,方向盤等車的元件,SAPI 就是路。

對於這些內容,可能有的人覺得有點無用,因為很多人偏執的認為自己只是個開車的,為什麼開車的要了解車子是怎麼跑起來的,對於瞭解如何製造一輛車更是嗤之以鼻。我曾經也這樣認為,直到翻譯Laravel文件時,Laravel 的作者給了我一些啟發,也把這些話送給看到這個文章的你們:

使用「現實世界」中的任何工具時,如果理解這個工具的運作原理,那麼你會更加得心應手的使用這個工具。應用開發也是這樣。當你明白你的開發工具如何執行的,你就會對它們的使用遊刃有餘。

這篇文件的目的是讓你更好的理解 Laravel 框架如何進行工作及它的工作原理。通過對框架進行全面的瞭解,一切都不會那麼「神奇」,也將會讓你更有自信的構建你的應用。

相關文章