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