php解析的過程,php是如何經過解析的

2021-10-25 21:15:39 字數 1465 閱讀 1407

要了解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**解析過程:

1、scanning(lexing) ,將php**轉換為語言片段(tokens)。

2、parsing, 將tokens轉換成簡單而有意義的表示式。

3、compilation, 將表示式編譯成opocdes。

4、execution, 順次執行opcodes,每次一條,從而實現php指令碼的功能。

現在有的cache比如apc,可以使得php快取住opcodes,這樣,每次有請求來臨的時候,就不需要重複執行前面3步,從而能大幅的提高php的執行速度。

nginx是如何解析php檔案的(PHP FPM)

我們先來了解下nginx,想要了解nginx我們先來看下面這兩個概念 正向 翻牆訪問谷歌 對於人來說可以感知到,但伺服器感知不到,我們叫他正向 伺服器。而nginx就是乙個高效能的http和反向 伺服器,也是乙個imap pop3 smtp伺服器 nginx解析php檔案實際上是通過乙個叫做 php...

Nginx解析PHP指令碼的過程

之前專案中碰到了一些php fpm的問題 因為 的一些介面,在特定情況下響應特別慢 1 2分鐘 遲遲不結束,導致php fpm數量越來越多,最後到達127個後,伺服器就沒能響應正常請求了,瀏覽器一直打轉,遲遲不響應。把介面修好後,php fpm程序的數量就穩定了,問題得以解決。這讓我對php fpm...

php如何實現泛解析

php實現泛解析的方法 1 泛解析網域名稱到伺服器ip 2 在iis裡面建立乙個空主機頭的站點 3 通過php系統變數 server http host 獲取當前訪問的網域名稱 4 根據當前訪問的網域名稱獲取到使用者名稱。php如何實現泛解析?1 泛解析網域名稱到你的伺服器ip,2 iis裡面建立乙...