1、Apache是如何解析php文件的
php
咱們常說的lamp架構是linux、apache、mysql、php,咱們知道任何架構或者網站離不開數據庫的支持,那麼php和apache又是如何協同工做的呢?html
php是apache的一個外掛程序,必須依靠web服務器才能夠運行。當客戶端瀏覽器觸發事件--->php程序提交到apache服務器---->apache服務器根據php程序的特色判斷是php程序,並從內存或者硬盤中提取訪問所須要的應用程序,將其提交給php引擎程序--->php引擎程序解析並讀取數據庫生成相應的頁面--->php引擎將html頁面返回給web服務器,web服務器再將頁面返回給客戶端。mysql
大體上這就是apache和php交互工做的過程。apache單獨不能處理php代碼,php(php 應用程序服務器)不能單獨存在的,須要以apache爲依託。也能夠說php是apache功能模塊的一種擴展,php做爲apache的外掛,用於解 析php代碼。通過解析的動態網頁此時就不存在<?php ?>了。當apache服務啓動的同時也啓動了php。也就是說php必須和apache安裝在同一臺服務器上,不能夠分割。須要注意的是,mysql與apache無關,只是在響應php代碼中的sql操做的時候才被訪問。不須要與apache安裝在同一臺服務器上,能夠單獨存在,只需php遠程鏈接便可。linux
php做爲一個動態的、共享的模塊被apache調用,在啓動apache時,自動加載。nginx
2、nginx是如何解析php文件的呢?web
要想搞清楚nginx是如何與php協同工做的,先來了解一下cgi和fastcgi兩個協議。CGI:common gateway interface,是web server與後臺編程語言交互的一種協議。有了這個協議,開發者可使用任何語言處理 Web Server 發來的請求,動態的生成內容。但 CGI 有一個致命的缺點,那就是每處理一個請求都須要 fork 一個全新的進程,隨着 Web 的興起,高併發愈來愈成爲常態,這樣低效的方式明顯不能知足需求。就這樣,FastCGI 誕生了,CGI 很快就退出了歷史的舞臺。FastCGI,顧名思義爲更快的 CGI,它容許在一個進程內處理多個請求,而不是一個請求處理完畢就直接結束進程,性能上有了很大的提升。sql
PHP-CGI是PHP自帶的FASTCGI管理器,但有不少的缺點。FPM一樣也是fastcgi的實現,相比php-cgi有不少的優勢。到了PHP5.3.3已經集成php-fpm了,再也不是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,能夠有效控制內存和進程、能夠平滑重載PHP配置,只須要在./configure時,加上--enable-fpm。
數據庫
FPM 是一個 PHP 進程管理器,包含 master 進程和 worker 進程兩種進程:master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則通常有多個 (具體數量根據實際須要配置),每一個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。
apache
從 FPM 接收到請求,處處理完畢,其具體的流程以下:編程
1.FPM 的 master 進程接收到請求
2.master 進程根據配置指派特定的 worker 進程進行請求處理,若是沒有可用進程,返回錯誤,這也是咱們配合 Nginx 遇到502錯誤比較多的緣由。
3.worker 進程處理請求,若是超時,返回504錯誤
4.請求處理結束,返回結果
FPM 從接收處處理請求的流程就是這樣了,那麼Nginx 又是如何發送請求給fpm 的呢?這就須要Nginx 層面來講明瞭。
咱們知道,Nginx 不只僅是一個Web 服務器,也是一個功能強大的Proxy 服務器,除了進行http 請求的代理,也能夠進行許多其餘協議請求的代理,包括本文與fpm 相關的fastcgi 協議。爲了能使Nginx 理解fastcgi 協議,Nginx 提供了fastcgi 模塊來將http 請求映射爲對應的 fastcgi 請求。
Nginx 的fastcgi 模塊提供了fastcgi_param 指令來主要處理這些映射關係,除此以外,很是重要的就是 fastcgi_pass 指令了,這個指令用於指定 fpm 進程監聽的地址,Nginx 會把全部的 php 請求翻譯成 fastcgi 請求以後再發送到這個地址。
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/www.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}
在這個配置文件中,/tmp/www.sock 是php-fpm監聽的socket文件,nginx經過location將全部的php文件,即http請求都交給fpm處理,實現了nginx和php的協同工做。
換言之,nginx就是做了fastcgi的一個代理,用fastcgi的方式結合使用了php。因此,須要開啓php-fpm服務。