PHP的构成及工作原理
PHP的設計理念及特點
多進程模型
由于PHP是多進程模型,不同請求間互不干涉,這樣保證了一個請求掛掉不會對全盤服務造成影響,當然,隨著時代發展,PHP也早已支持多線程模型。
弱類型語言
和C/C++、Java、C#等語言不同,PHP是一門弱類型語言。一個變量的類型并不是一開始就確定不變,運行中才會確定并可能發生隱式或顯式的類型轉換,這種機制的靈活性在web開發中非常方便、高效。
引擎(Zend)+組件(ext)的模式降低內部耦合。
中間層(sapi)隔絕web server和PHP。
語法簡單靈活,沒有太多規范。缺點導致風格混雜,但再差的程序員也不會寫出太離譜危害全局的程序。
PHP的構成
PHP源碼主要目錄有下列幾個:
SAPI:全稱是Server Application Programming Interface,也就是服務端應用編程接口,SAPI層可以適配不同的應用環境,可以認為是PHP的宿主環境。SAPI通過一系列構造函數,使得PHP可以和外圍交互數據,這是PHP非常優雅和成功的一個設計,通過SAPI成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。-
常用的兩個SAPI是Cli和Fpm,另外還有Embed,這三種是比較典型的SAPI,除此還有litespeed和apache2handle,除了Cli和Fpm其他都是配合其他應用使用的。
main:PHP的主要代碼,主要是輸入/輸出、web通信,以及PHP框架的初始化操作(如FASTCGI協議的解析、擴展的加載、PHP配置解析等工作)等,位于ZendVM的上一層。
ZendVM:是一個虛擬計算機,介于PHP應用與實際計算機之間,用于解析執行PHP代碼。ZendVM是PHP語言的核心部分,PHP的代碼解釋、執行就是由Zend完成的。Zend整體用純C實現,它將PHP代碼翻譯(詞法、語法解析等一系列編譯過程)為可執行opcode的處理并實現相應的處理方法、實現了基本的數據結構(如hashtable、oo)、內存分配及管理、提供了相應的api方法供外部調用,是一切的核心,所有的外圍功能均圍繞Zend實現。
虛擬機的特點是實現跨平臺,只需要按照不同平臺編譯出對應的解析器就可以實現代碼的跨平臺執行。
ext(Extension):擴展是PHP內核提供的一套用于擴充PHP功能的一種方式,PHP社區中有豐富的擴展可供使用。圍繞著Zend引擎,extensions通過組件式的方式提供各種基礎服務,我們常見的各種內置函數(如array系列)、標準庫等都是通過extension來實現,用戶也可以根據需要實現自己的extension以達到功能擴展、性能優化等目的。
通過擴展,可以使用C/C++實現更強大的功能和更高的性能。擴展可分為PHP擴展、Zend擴展(主要應用于ZendVM)。
PHP的生命周期
從main()開始,PHP生命周期分為以下幾個階段:
- 模塊初始化階段(module startup)
- 請求初始化階段(request startup)
- 執行腳本階段(execute script),編譯解析執行。
- 請求關閉階段(request shutdown)
模塊關閉階段(module shutdown)
不同的SAPI的實現,各個階段的執行情況會有一些差異。
PHP實現一個典型動態語言的執行過程:
- 拿到一段代碼后,經過詞法解析、語法解析等階段后,源程序會被翻譯成一個個指令(opcodes);
- ZEND虛擬機順次執行這些指令完成操作,進行語義解析,然后通過執行引擎執行。
PHP本身是用C實現的,因此最終調用的也都是C的函數,實際上,可以把PHP看做是一個C開發的軟件
參考:
總結
以上是生活随笔為你收集整理的PHP的构成及工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逆向笔记——PE文件相对虚拟地址(RVA
- 下一篇: PHP7的变化