要了解php的解析過程首先要了解cgi,fastcgi,php-fpm的相關概念。
cgi是什麼?
cgi(通用網關介面)實際上是一種協議,實現cgi協議的程序我們可以稱之為cgi程序,CGI 應用程式能與瀏覽器進行交互,還可通過數據庫API與資料庫伺服器等外部資料來源進行通訊,從資料庫伺服器取得資料。格式化為HTML文件後,傳送給瀏覽器,也可以將從瀏覽器取得的資料放到資料庫中。而php-cgi就是用來解析PHP程式碼的一種協定。但是這種協定有幾個弊端。
首先,每當客戶端請求一個PHP腳本檔案時,伺服器就會fork一個進程呼叫解析器來對該腳本進行解析,當這個腳本執行完畢後該進程就會被kill掉,並且每次fork的進程都會過一遍php.ini來初始化環境。進程無法重複使用,並且增加了對php.ini的io開銷。限制了PHP的執行速度。於是聰明的phper想出了更好的cgi協議,也就是後來出的fastcgi協議。
fastcgi協定
顧明思議,更快的cgi協定。那他快在哪裡呢?
首先fastcg解決了原有的php-cgi的毛病,它允許在一個進程內處理多個請求,而不是一個請求處理完畢就直接結束進程,web伺服器效能上有了很大的提高。實際上Fastcgi會先啟動一個master,解析設定文件,初始化執行環境,然後再啟動多個worker。
當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閒worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。
php-fpm
PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個PHPFastCGI管理器,對於PHP 5.3.3之前的php來說,是一個補丁包 ,旨在將FastCGI進程管理整合進PHP包中。
如果你使用的是PHP5.3.3之前的PHP的話,就必須將它patch到你的PHP原始碼中,在編譯安裝PHP後才可以使用。實際上我們可以把php-fpm看成 一個解釋器。我們可以使用指令:ps -aux | grep php-fpm來查看對應的進程狀態,如下圖:
#使用php-fpm是可以平滑重啟的,一般修改php.ini之後,php-cgi進程是沒辦法平滑重啟的,也就是說你必須重新啟動服務才能重新載入新的設定。而php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,透過這個機制來平滑過度。
PHP程式碼解析過程:
1、Scanning(Lexing) ,將PHP程式碼轉換為語言片段(Tokens)。
2、Parsing, 將Tokens轉換成簡單而有意義的表達式。
3、Compilation, 將表達式編譯成Opocdes。
4、Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。
現在有的Cache例如APC,可以使得PHP快取住Opcodes,這樣,每次有請求來臨的時候,就不需要重複執行前面3步,從而能大幅的提高PHP的執行速度。
推薦教學:PHP影片教學
#以上是php是如何經過解析的的詳細內容。更多資訊請關注PHP中文網其他相關文章!