PHP 是怎么接收到請(qǐng)求的2019-08-14

本篇文章主要描述一下幾點(diǎn)

● nginx 怎么轉(zhuǎn)發(fā)請(qǐng)求 給 PHPFPM?

● CGI 和 FastCGI 到底是個(gè)什么玩意?

● PHPFPM 是什么?有什么作用?

簡(jiǎn)單場(chǎng)景描述

在瀏覽器上訪問(wèn)一個(gè) php+nginx+mysql 構(gòu)建的商城,并且購(gòu)買一件商品。

分析 (這里訪問(wèn)的有兩種資源)

● 靜態(tài)資源(網(wǎng)站的一些圖片,圖標(biāo)等)

● 動(dòng)態(tài)資源 (購(gòu)買商品的價(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 端口,通過(guò) nginx 配置正則匹配是否屬于靜態(tài)資源,如果是靜態(tài)資源則返回文件,請(qǐng)求結(jié)束。如果是動(dòng)態(tài)資源,通過(guò) 正則匹配到請(qǐng)求 php 腳本,那么他會(huì)通過(guò) nginx 的模塊 ngx_http_fastcgi_module 把請(qǐng)求分發(fā)給 PHPFPM 處理,然后處理完畢返回結(jié)果。

● CGI

CGI 是 Web 服務(wù)器運(yùn)行外部程序的規(guī)范。意思就是通過(guò) CGI 可以與你的程序通信,通過(guò) 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

作為世界上最好的語(yǔ)言,當(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)加載了配置,加載了你寫代碼。所以說(shuō) 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)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最早的Web服務(wù)器,可以簡(jiǎn)單地響應(yīng)瀏覽器發(fā)來(lái)的HTTP請(qǐng)求,并將存儲(chǔ)在服務(wù)器上的HTML文件返回給瀏覽器,也就是靜...
    趙客縵胡纓v吳鉤霜雪明閱讀 5,163評(píng)論 1 29
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問(wèn)題,請(qǐng)求時(shí)即使無(wú)狀態(tài)連接如web服務(wù)都無(wú)法達(dá)到并發(fā)響應(yīng)量級(jí)一萬(wàn)的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,214評(píng)論 0 9
  • [toc] 在公司的網(wǎng)站上推薦使用 docker 容器來(lái)安裝環(huán)境,一個(gè)項(xiàng)目一個(gè) docker 容器。 、、 百度百...
    Mdvtrw閱讀 1,569評(píng)論 0 1
  • 這篇是Nginx安裝配置PHP(FastCGI)環(huán)境的教程。Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外...
    SkTj閱讀 3,219評(píng)論 2 20
  • 大多數(shù) Nginx 新手都會(huì)頻繁遇到這樣一個(gè)困惑,那就是當(dāng)同一個(gè)location配置塊使用了多個(gè) Nginx 模塊...
    SkTj閱讀 8,246評(píng)論 0 12

友情鏈接更多精彩內(nèi)容