内容简介:這篇文章雖然主題為一個 http 請求進來後,php 到底是如何運行呢 ?要理解這件事情,有個最基本的觀念要先理解,那就是下面這段指令,它到底是如何運行的。
這篇文章雖然主題為 PHP 的 Web 運行原理
,但是比較白話文的說,事實上是想要理解這件事情 :
一個 http 請求進來後,php 到底是如何運行呢 ?
要理解這件事情,有個最基本的觀念要先理解,那就是下面這段指令,它到底是如何運行的。
php index.php
然後接下來才能在理解 Web 是如何用 php 來處理。
這篇文章將分為以下幾個章節 :
- 執行 php index.php 它是如何運行的呢 ?
- 三種用 PHP 來處理 HTTP 的模式
- Web PHP 應用組合與問題
執行 php index.php 它是如何運行的呢 ?
假設我們在 Terminal 執行了如下的指令。
php index.php
那實際上它的運行流程會如下圖,而這張圖也代表 PHP 的基本運行架構。
- SAPI ( Server Application Programming Interface ) : 它就是一個
應用環境
與PHP 核心
的一個 Interface,會有這層主要的原因在於,不同的應用環境,例如命令行環境(就是在 Terminal 執行 php) 或 Web 環境都需要不同的 PHP 環境配置,如果沒有這一層就代表 PHP 本身要針對不同的環境來考慮設計兼容,這也是為什麼會有 SAPI 的目的。 - main : 它是 php 所有操作的整合者。
- Zend 引擎 : 它就是將咱們編寫的 PHP 程式碼解釋成可以執行的 opcode 碼,其中 PHP7 與 PHP5 有速度上的飛升原因就在於此,PHP7 大幅度的優化了 Zend 引擎。
- Extension : 它是 PHP 內核所提供的一套擴充 PHP 功能的方式,大部份都是使用 C/C++ 所撰寫,基本上可以分為 PHP extension 與 Zend extension。
三種用 PHP 來處理 HTTP 的模式
那如果改成 Web 情況下,上面那張圖會變成什麼樣子呢 ? 如下圖,就只是將 Terminal 那改成 Web Server。
然後 Web 模式基本上可分為三種模式 :
- 模組模式
- CGI 模式 (這只是過渡期,現在沒啥在用)
- Fast-CGI 模式
Module 模式
在早期開發 PHP 時,大部份的人應該都用過 LAMP 這東西,它就是 Linux + Apache + MySQL + PHP 這些東組合。
然後在通常會在 Apache Web Server 上設置一段指令 :
LoadModule php5(or 7)_module modules/mod_php5.so
這一段就是讓 Apache 把 php 當成一個模塊來處理。
在種情況下,一個 http 請求它是如何的運行呢 ?
運行模式下圖 :
- 瀏覽器發送一個 http 請求到 Apache Web Server。
- Apache 收到以後,如果發現是 .php 的請求,則會使用 php5_module 來解析 php。
- php5_module 接下來會將 php 代碼丟到 sapi 來進行一些針對 Apache 的環境設定 然後最後在由 zedn 來處理這段程式碼。
但這裡有個問題。
那假如我不用 Apache 呢 ?
這就是為什麼會有下面這個模式的原因。
CGI 模式
雖然 LAMP 方案在當時很流行,但是並不是每個人都想使用 Apache,而且比較正確的說法,應該是說,不是所有的 Web Server 都有建立 PHP 模組,那這種情況下要怎麼辦呢 ?
這時就有所謂的 CGI 協議
。
CGI 定義了讓 Web Server 與請求處理程序(ex. php)溝通的標準。
它的運行流程如下圖 :
- 瀏覽器發送一個 http 請求到 Web Server
- Web Server 產生出一個已實作 CGI 協議的 child process (ex. php-cgi)
- 子進程解析 php.ini 進行初使化環境。
- 處理 http 請求,並返回給 Web Server。
- 關閉子進程。
這裡有幾點事情要注意一下
首先實作 CGI 協議的 child process,這裡,這句話事實上也代表了不限制任何語言,而 php-cgi 就只是一個使用 php 來實作 CGI 協議的程式,它可以用來解析從 Web Server 傳送過來的 CGI 請求,並且用 php 來處理。
這種模式有什麼缺點呢 ?
上面使用這種 CGI 模式的缺點就在於,它每一個 http 請求就需要 fork 一個 CGI 子進程來處理,然後大量的請求一定會倒。
這也是為什麼之後會出現一個叫 Fast-CGI
的協議。
Fast-CGI
Fast-CGI
它也是個協定,它運作的標準如下 :
- 先產生一個 master 進程。
- 解析 php.ini 來初使化環境。
- 然後預先建立多個 worker 進程。
- 當有一個請求時會分配給某個 worker 來處理。
- 當 worker 不夠用時,master 會在建立 worker,而當 worker 閒置太多時,master 也會減少 worker。
而這裡就要提到一個新名詞 PHP-FPM
,它就是根據 Fast-CGI 協議所實作進程管理器。
所以當一個 http 請求進來時,使際上的運作會如下圖 :
- 一個 http 請求從瀏覽器送到 Web Server。
- Web Server 會將此請求包含旁 Fast-CGI 協議標準,發送給 PHP-FPM 所管理的 Master 進程。
- 接下來 Master 進程會將請求在發送給某個 worker 來處理。
- 最後 worker 處理完後返回結果,然後在等待接客。
Web PHP 應用組合與問題
根據咱們上述學的模式,基本上現今 PHP Web 的組合大至上可以分為以下兩種 :
- Apache + php module
- Nginx + php-fpm
在早期的時後,基本上一定是選擇 Nginx + php-fpm 這種類型來開發 PHP Web 應用,主要的原因在於使用 moduel 模式的 PHP Web 它就只是單線程的應用,這也代表一定會有效能壓力,但是之後 Apache 提供了一個叫 MPM (Multi-Processing Module) 就解決了這個問題。
或需有人認為 Nginx 一定比較快,因為它有 Event Loop 機制,可以不塞車,但是問題是處理 PHP 的地方是在另個 process 中和 Nginx Event Loop 也就沒啥過係。
所以目前我也不敢保證說選那個比較好,這方面還需要更深入的探討。
那這種二模式有什麼問題呢 ?
比較大的問題是 :
它每一個 worker 同時間只能處理一個 http 請求
雖然它已經比 CGI 模式下還可以處理更多的請求,但它還是有一定的瓶頸在。
而這就是下一篇文章中要 Swoole 的原因。
參考資料
以上所述就是小编给大家介绍的《PHP 的 Web 運行原理 ( 1 )》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- java反射原理, 注解原理
- Webpack 原理(二):加载原理
- Docker原理之 - CGroup实现原理
- 【Vue原理】响应式原理 - 白话版
- Docker实现原理之 - OverlayFS实现原理
- UAV MOF工作原理之Agent注入机制原理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
新内容创业:我这样打造爆款IP
南立新、曲琳 / 机械工业出版社 / 2016-5-10 / 39.00
这是个内容创业爆棚的时代,在采访几十家内容创业公司,与一线最优秀的创业者独家对话之后,作者写作了这本书,其中包括对这个行业的真诚感触,以及希望沉淀下来的体系化思考。 本书共分三个部分讲述了爆红大号的内容创业模式和方法。其中第一部分,讲述了新的生产方式,即内容形态发展的现状--正在被塑造;第二部分,讲述了新的盈利探索,即从贩卖产品到贩卖内容的转变,该部分以多个案例进行佐证,内容翔实;第三部分,......一起来看看 《新内容创业:我这样打造爆款IP》 这本书的介绍吧!