記得我剛開始學習PHP的時候,許多面試官會常常問我PHP是什麼,那時的標準回答是PHP是一種弱類型動態腳本編程語言,開源,免費,是超文本預處理器的縮寫。android
這只是很淺的解釋,PHP對我來講是一個工具,是我手裏的一把錘子,雖然這把錘子時常被調侃爲兩邊都是起釘器的錘子。程序員
多進程模型面試
PHP是以多進程模型設計的,這樣的好處是請求之間互不干涉,一個請求失敗也不會對其餘進程形成影響,做爲最開始僅僅用於我的網站的一個工具集這樣的設計並無什麼不妥,隨着PHP的應用變大,訪問量增長這種方式顯然是不合適的,由於啓動一個進程的開銷對於海量請求是不划算的,因此如今PHP基本都是運行在PHP-FPM的管理下的,這是一個PHP進程管理器,它常駐內存啓動一些PHP進程待命,當請求進入時分配一個進程進行處理,PHP進程處理完畢後回收進程,但並不銷燬進程,這讓PHP也能應對高流量的訪問請求。編程
固然如今也有PHP多線程的解決方案和基於協程的解決方案讓PHP更高效的處理WEB請求。緩存
弱類型數據結構
與 JAVA、C/C++ 不一樣,PHP是一門若類型的語言,變量在聲明的那一刻是不須要肯定它的類型的,而在運行時類型也會發生顯式或隱式的類型改變,這也是PHP開發應用迅速、方便的緣由之一。多線程
其餘架構
Zend 引擎 + Ext 擴展 的模式下降了內部耦合,能夠方便的爲PHP自己增長功能和去除功能。框架
語法簡單,沒有太多強制規範,編程風格上既能夠用過程式、也能夠用面向對象的方式進行開發,固然函數式也能夠。編程語言
以目前的 PHP 主流版本 PHP7 和 PHP5 來講架構是如上圖所示,主要有四層體系構成,從下到上依次是 Zend 引擎、Extensions 擴展、SAPI 接口、上層應用。
Zend 引擎
Zend 引擎是 PHP4 之後加入 PHP 的,是對原有PHP解釋器的重寫,總體使用 C 語言進行開發,也就是說能夠把PHP理解成用C寫的一個編程語言軟件,引擎的做用是將PHP代碼翻譯爲一種叫opcode的中間語言,它相似於JAVA的ByteCode(字節碼)。
引擎對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 框架如何進行工做及它的工做原理。經過對框架進行全面的瞭解,一切都不會那麼「神奇」,也將會讓你更有自信的構建你的應用。