這篇文章將為大家詳細(xì)講解有關(guān)PHP 接收到請(qǐng)求的原因,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寧明ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寧明網(wǎng)站制作公司
本篇文章主要描述一下幾點(diǎn)
● nginx 怎么轉(zhuǎn)發(fā)請(qǐng)求 給 PHPFPM?
● CGI 和 FastCGI 到底是個(gè)什么玩意?
● PHPFPM 是什么?有什么作用?
簡(jiǎn)單場(chǎng)景描述
在瀏覽器上訪問一個(gè) php+nginx+MySQL 構(gòu)建的商城,并且購買一件商品。
分析 (這里訪問的有兩種資源)
● 靜態(tài)資源(網(wǎng)站的一些圖片,圖標(biāo)等)
● 動(dòng)態(tài)資源 (購買商品的價(jià)格,商品的簡(jiǎn)介等)
瀏覽器發(fā)起請(qǐng)求 --> web_server(nginx)分發(fā)處理 --> php 執(zhí)行代碼返回結(jié)果 (這是大概的流程)
nginx 是怎么分發(fā)請(qǐng)求?
當(dāng)用戶發(fā)起請(qǐng)求的時(shí)候 (瀏覽器默認(rèn)請(qǐng)求 80 端口),nginx 監(jiān)聽到 80 端口,通過 nginx 配置正則匹配是否屬于靜態(tài)資源,如果是靜態(tài)資源則返回文件,請(qǐng)求結(jié)束。如果是動(dòng)態(tài)資源,通過 正則匹配到請(qǐng)求 php 腳本,那么他會(huì)通過 nginx 的模塊 ngx_http_fastcgi_module 把請(qǐng)求分發(fā)給 PHPFPM 處理,然后處理完畢返回結(jié)果。
● CGI
CGI 是 Web 服務(wù)器運(yùn)行外部程序的規(guī)范。意思就是通過 CGI 可以與你的程序通信,通過 CGI 標(biāo)準(zhǔn)格式。你的程序可以和瀏覽器交互。
(簡(jiǎn)單理解 CGI 就是一個(gè)協(xié)議,規(guī)定了一些東西該怎么傳,你的程序這邊怎么接受處理等規(guī)范。)
● PHP-CGI
PHP-CGI 就是 CGI 協(xié)議 php 的一個(gè)實(shí)現(xiàn)版。PHP-CGI 會(huì)為每個(gè)請(qǐng)求 fork 一個(gè)進(jìn)程處理,處理完成后退出。(這個(gè)模式叫做 fork-and-execute)。這樣的模式不符合現(xiàn)在動(dòng)不動(dòng)大規(guī)模的流量,所以已退出歷史舞臺(tái)。
● FastCGI
FastCGI 是 CGI 的升級(jí)版,他會(huì)預(yù)先啟動(dòng)一個(gè) master 進(jìn)程讀取配置文件,然后 fork 多個(gè) work 進(jìn)程等待連接。監(jiān)聽到請(qǐng)求,分配個(gè) work 進(jìn)程做具體的處理。這樣大大提高了程序的性能。(FastCGi 會(huì)管理進(jìn)程,處理完成后不會(huì)輕易銷毀。而 CGI 會(huì)為每一個(gè)請(qǐng)求 創(chuàng)建進(jìn)程,銷毀進(jìn)程。)
● PHPFPM
作為世界上最好的語言,當(dāng)然要跟上潮流。當(dāng)發(fā)現(xiàn) PHP-CGI 性能不佳時(shí),又恰好出現(xiàn)了 FastCGI 協(xié)議。所以 PHP 實(shí)現(xiàn)了一個(gè) php 版本的 FastCGI,名字叫做 PHPFPM(FastCGI Process Manager)。 PHPFPM 啟動(dòng)時(shí)會(huì)開啟 一個(gè) master 進(jìn)程和若干個(gè) work 進(jìn)程。master 進(jìn)程監(jiān)聽請(qǐng)求,并轉(zhuǎn)發(fā)給 work 進(jìn)程處理,每一個(gè) work 進(jìn)程都有一個(gè) php 解釋器,你的代碼在每一個(gè) work 進(jìn)程中都有一份,work 進(jìn)程是真正執(zhí)行代碼的地方。
SO
PHPFPM 監(jiān)聽 9000 端口,nginx 匹配到 php 文件,把請(qǐng)求轉(zhuǎn)發(fā)給 PHPFPM。PHPFPM master 監(jiān)聽到請(qǐng)求后,分配給 work 處理(每一個(gè) work 進(jìn)程中都有一個(gè) php 解釋器),PHPFPM 在啟動(dòng)的時(shí)候就已經(jīng) work 進(jìn)程已經(jīng)加載了配置,加載了你寫代碼。所以說 work 進(jìn)程收到請(qǐng)求后立馬執(zhí)行,然后返回結(jié)果。
ngx_http_fastcgi_module 模塊
在瀏覽器請(qǐng)求 web_server 是 http 協(xié)議 或者 https 協(xié)議,但是 PHPFPM 不懂怎么辦了?這里 nginx 提供了一個(gè) ngx_http_fastcgi_module ,ngx_http_fastcgi_module 把 http 或者 https 請(qǐng)求 映射成 FastCGI 請(qǐng)求。這樣 php 程序就能和用戶互動(dòng)了。
純個(gè)人理解,如果有誤請(qǐng)指出。
關(guān)于PHP 接收到請(qǐng)求的原因就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。