PHP與webserver【簡書看到的】


很久以前,人們造出來一個機器人,它的英文名字叫web server,中文名叫網頁服務器。(為了簡寫,下文稱web server為server)

server的工作很簡單,就是做內容的分發。

初期的sever功能很簡單,只能處理靜態請求,當客戶端請求/index.html的時候,server去文件系統里面找到對應的index.html文件,然后返回給客戶端,這個時期的server就像一個倉庫管理員,別人要啥,他給啥。

可是這樣的機器人很明顯不能滿足人們的需求,因為sever機器人只能處理靜態請求,卻不能處理動態請求,如/index.php或者/index.java,這就好像它是服務員,只能端出做好的紅燒肉,卻不能自己做出紅燒肉。

為了能夠讓server機器人處理動態請求(做出紅燒肉),聰明的人類開始了他們的發明,於是他們在server機器人的肚子上挖出了一個長方形的洞,取名叫做接口,這個接口上只要插入制作紅燒肉的智能芯片,server機器就能做紅燒肉,插入制作烤魚的芯片,server機器就能做烤魚。

為了體現專業性,人們給sever機器人肚子上面的洞,這個接口,取了一個高大上的名字,叫做CGI(全稱是是Command Gateway Interface,通常翻譯為公共網關接口),通過這個接口,其他的應用程序可以與server機器人進行交互。

制作紅燒肉的芯片,叫做php解析器。

制作紅燒肉的芯片,叫做java解析器。

當然,與server進行交互的應用程序除了php解析器,java解析器,還有很多。

綜上,sever主要工作內容:

(1)處理靜態請求,當客戶端請求靜態文件的時候,如/a.html,web server會去文件系統中找到a.html這個文件,發送給瀏覽器。

(2)處理動態請求,當客戶端請求/a.php的時候,web server會根據自己的配置文件(http.conf或者nginx.conf)得知,該請求的是動態數據,於是web server需要把請求交給PHP解析器(php-cgi)來處理,webserver與php通信需要遵循cgi接口定義的協議,將url地址,header消息頭,post/get數據等一系列內容按照一定的格式傳給php解析器(即php-cgi)處理,php解析器處理完成之后返回給web server,最后web server接到結果返回給客戶端。

 

好景不長,問題來了

CGI接口的出現,讓server能夠處理動態請求,讓server的功能有另一個飛躍。

每天,客戶端與server就這樣不斷的循環往復:

 


(1)客戶端發送請求給sever

(2)server接收請求和數據

(3)server會fork一個進程來啟動對應的CGI程序(這里主要是php-cgi,PHP的解釋器是php-cgi

(4)php-cgi會解析php.ini文件,初始化執行環境,並處理請求,解析CGI接口傳來的數據

(5)php-cgi以CGI接口規定的格式返回server處理后的結果

(6)server將結果返回客戶端。

可是,好景不長,一心追求完美的人類,發現了一個問題。

每次客戶端發起新的請求,server端都會fork一個進程出來啟動php-cgi,而php-cgi卻又每次都會進行一次初始化的工作(解析php.ini文件,初始化執行環境),人們覺得這樣的重復實在效率太低,不僅很消耗時間,還很耗資源,於是想出來一個新的方案。

新的方案來臨,FASTCGI的誕生

FASTCGI和CGI一樣也是接口,是CGI的升級方案。

當server啟動的時候,fastcgi會先啟一個master進程(這里是php-fpm,主要用來管理php-cgi),解析php.ini,初始化執行環境,然后再啟動多個worker(php-cgi)。當請求過來時,master會傳遞給一個worker(php-cgi),然后立即可以接受下一個請求,同時,當worker不夠用時,master可以根據配置預先啟動幾個worker等着;當然空閑worker太多時,也會停掉一些。


 

這種fastcgi對進程的管理,避免了重復的勞動,提高了性能,縮短了處理的時間,節省了資源,也就成為了目前主流的通信交互方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM