PHP 是怎麼接收到請求的?

本篇文章主要描述一下幾點php

● nginx 怎麼轉發請求 給 PHPFPM?mysql

● CGI 和 FastCGI 究竟是個什麼玩意?nginx

● PHPFPM 是什麼?有什麼做用?web

簡單場景描述sql

在瀏覽器上訪問一個 php+nginx+mysql 構建的商城,而且購買一件商品。瀏覽器

分析 (這裏訪問的有兩種資源)服務器

● 靜態資源(網站的一些圖片,圖標等)性能

● 動態資源 (購買商品的價格,商品的簡介等)網站

瀏覽器發起請求 --> web_server(nginx)分發處理 --> php 執行代碼返回結果 (這是大概的流程)server

nginx 是怎麼分發請求?

當用戶發起請求的時候 (瀏覽器默認請求 80 端口),nginx 監聽到 80 端口,經過 nginx 配置正則匹配是否屬於靜態資源,若是是靜態資源則返回文件,請求結束。若是是動態資源,經過 正則匹配到請求 php 腳本,那麼他會經過 nginx 的模塊 ngx_http_fastcgi_module 把請求分發給 PHPFPM 處理,而後處理完畢返回結果。

● CGI

CGI 是 Web 服務器運行外部程序的規範。意思就是經過 CGI 能夠與你的程序通訊,經過 CGI 標準格式。你的程序能夠和瀏覽器交互。

(簡單理解 CGI 就是一個協議,規定了一些東西該怎麼傳,你的程序這邊怎麼接受處理等規範。)

● PHP-CGI

PHP-CGI 就是 CGI 協議 php 的一個實現版。PHP-CGI 會爲每一個請求 fork 一個進程處理,處理完成後退出。(這個模式叫作 fork-and-execute)。這樣的模式不符合如今動不動大規模的流量,因此已退出歷史舞臺。

● FastCGI

FastCGI 是 CGI 的升級版,他會預先啓動一個 master 進程讀取配置文件,而後 fork 多個 work 進程等待鏈接。監聽到請求,分配個 work 進程作具體的處理。這樣大大提升了程序的性能。(FastCGi 會管理進程,處理完成後不會輕易銷燬。而 CGI 會爲每個請求 建立進程,銷燬進程。)

● PHPFPM

做爲世界上最好的語言,固然要跟上潮流。當發現 PHP-CGI 性能不佳時,又剛好出現了 FastCGI 協議。因此 PHP 實現了一個 php 版本的 FastCGI,名字叫作 PHPFPM(FastCGI Process Manager)。 PHPFPM 啓動時會開啓 一個 master 進程和若干個 work 進程。master 進程監聽請求,並轉發給 work 進程處理,每個 work 進程都有一個 php 解釋器,你的代碼在每個 work 進程中都有一份,work 進程是真正執行代碼的地方。

SO

PHPFPM 監聽 9000 端口,nginx 匹配到 php 文件,把請求轉發給 PHPFPM。PHPFPM master 監聽到請求後,分配給 work 處理(每個 work 進程中都有一個 php 解釋器),PHPFPM 在啓動的時候就已經 work 進程已經加載了配置,加載了你寫代碼。因此說 work 進程收到請求後立馬執行,而後返回結果。

ngx_http_fastcgi_module 模塊

在瀏覽器請求 web_server 是 http 協議 或者 https 協議,可是 PHPFPM 不懂怎麼辦了?這裏 nginx 提供了一個 ngx_http_fastcgi_module ,ngx_http_fastcgi_module 把 http 或者 https 請求 映射成 FastCGI 請求。這樣 php 程序就能和用戶互動了。

純我的理解,若是有誤請指出。

以上就是PHP 是怎麼接收到請求的?的詳細內容!更多請關注php交流羣:點擊加羣

相關文章
相關標籤/搜索