解讀web服務器與php的工做原理

最近決定重讀php手冊(好吧,其實以前也沒怎麼讀,尷尬臉),既然是重讀,那就從php的安裝開始咯,而後被手冊中出現的各類新詞搞懵逼了,什麼cgi、fastcgi、sapi、fpm,蒼天啊,這些都是什麼鬼?通過一番谷歌、百度、知乎,本身總結出一點淺薄的知識,暫且記錄,之後有新發現再回來填坑。
仍是先簡單說一下一個完整的請求過程吧。php

  • 首先用戶點擊一個連接,發起一個url請求
  • web服務器會判斷這是一個靜態的請求,仍是動態的。若是是靜態的直接查找資源返回給瀏覽器,這裏主要說一下動態的請求
  • 若是是一個動態的請求,web服務器是沒有能力處理的,須要交給一些後臺的編程語言處理,好比說php、java、asp等等。敲黑板啦,請注意這裏,web服務器像apache、nginx等都是用C語言寫的,如何和不一樣的後端語言進行交流呢?
    這裏就有不一樣的方式,按照php的流程控制,這裏應該來一個switch語句或者if else語句,哈哈。

第一種:官方手冊稱之爲handler(谷歌翻譯爲:處理程序)
工做流程大概是這樣的,他會直接加載php模塊,每一次動態的請求都會產生一個進程,可是他們二者之間仍是沒辦法交流啊,是的,php會提供一個統一的接口sapi(Server Application Programming Interface)來和web服務器交流(至於究竟是哪一種接口,怎麼工做的,我還不清楚,但願有大牛幫忙指點)。
這種方式有兩個缺點:
(1)每一次的請求都會產生一個進程,全部若是遇到高併發的時候,就很容易死翹翹了。
(2)php和web服務器的耦合度很高,若是出現問題,很難判斷究竟是誰的錯誤。html

之前沒理解的一些細節:
之前咱們在配置服務器的時候,讓apache可以解析php代碼,是這樣修改httpd.conf文件的java

//加載php模塊
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php

//添加index.php
<IfModule dir_module>
   DirectoryIndex index.html  index.htm index.php 
</IfModule>

注意:上面的web服務器也就是apache第一個先找的文件是.html或者.htm文件爲後綴的,由於這樣的話就不須要和php通訊了嘛,本身能辦到的事就先不麻煩別人了nginx

扯的有點遠了,回來繼續說第二種。
第二種:cgi的方式
cgi是sapi的一種實現方式。它的工做原理大概是這樣的:web服務器要讓php去處理動態請求,可是前面提到二者語言不通啊,就比如你和一個日本人交流,都聽不懂對方說的話,怎麼辦,你們都說英語吧。這裏也是同樣,不過使用的是cgi。web服務器要告訴php我這邊收到的HTTP header、url、post數據等,經過cgi這種標準協議,將數據傳輸過去,而後php經過cgi就會解析php.ini文件,初始化執行環境,處理請求。最後再經過cgi將處理的結果返回給服務器,服務器將數據返回給瀏覽器。
是否是一切都很完美,嗯,等等,若是遇到高併發怎麼辦?老兄,你可不能夠快點?搞得和《瘋狂動物城》裏的「閃電」同樣,你能不能早點把該辦的事情辦好,高併發來的時候可不能夠多幾我的手辦事?
時間過了幾年,「閃電」終於快退休了,出來了fastcgi。 它會和apache一塊兒啓動,啓動一個master,解析配置文件,初始化執行環境,而後生成多個cgi,等待調用。一切都很完美,有一種金星完美手勢的既視感。
可是童靴們,前面說過了,cgi是一種協議,fastcgi也是一種協議,它不過是比cgi要好點,可是終究改變不了本質,他本身是沒有進程管理的。php-cgi是php官方自帶的fastcgi管理器,可是很弱雞呀,主要有如下兩個缺點:
(1)php-cgi變動php.ini配置以後須要重啓php-cgi才能讓新的php-ini生效,不能夠平滑重啓(終於知道爲何每次更改配置文件以後要重啓了)
(2)直接殺死php-cgi進程,php就不運行了。
後來php-fpm就誕生了,php-fpm可以調度php-fpmphp-cgi進程的程序,進行管理。web

相關文章
相關標籤/搜索