怎麼執行php PHP是怎麼接收到請求的?

2021-10-14 18:31:41 字數 2063 閱讀 2612

每日17點準時技術乾貨分享

php 是怎麼接收到請求的?

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

● nginx 怎麼**請求 給 phpfpm?

● cgi 和 fastcgi 到底是個什麼玩意?

● phpfpm 是什麼?有什麼作用?

簡單場景描述

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

分析 (這裡訪問的有兩種資源)

● 動態資源 (購買商品的**,商品的簡介等)

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

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 程序是真正執行**的地方。

sophpfpm 監聽 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 程式就能和使用者互動了。

純個人理解,如果有誤請指出。

-end-

宣告:本文選自「 php中文網 」,搜尋「 phpcnnew 」即可關注!

核心執行緒是怎麼執行

pid t kernel thread int fn void void arg,unsigned long flags 通過這個函式可以建立核心執行緒,執行乙個指定函式fn。但是這個fn是怎麼執行的了?pid t kernel thread int fn void void arg,unsigne...

Struts是怎麼執行的?

然後actionservlet根據struts config.xml的配置資訊,呼叫loginaction物件去處理這個請求,在此之前,它會將頁面表單的請求資料封裝到loginactionform物件中,並傳遞給loginaction loginaction返回乙個actionforward物件,包...

怎麼獲取今天的時間戳php,php怎麼獲取時間戳

php獲取時間戳的方法 可以利用time 函式或strtotime 函式來獲取。time 函式返回乙個包含當前時間的unix時間戳的整數。strtotime 函式將任何字串的日期時間描述解析為unix時間戳。time 函式返回自 unix 紀元 january 1 1970 00 00 00 gmt...