## SAPI 運行模式
### CGI運行模式
- web服務器會根據請求的內容,fork一個子進程啟動CGI程序,這里就是指PHP的解析器,PHP解析器程序啟動后,它就會解析php.ini文件,初始化執行環境,然后解析動態腳本,再把處理完的數據返回給web服務器,最后web服務器把內容發送給用戶,剛才fork的進程也隨之退出。當下次再有php任務請求時,再重復之前的操作。
- 每次處理請求都會重啟cgi程序(PHP解析器),cgi程序需要解析php.ini等初始化工作,造成效率低下,服務器負擔加重
### Fast-cgi運行模式
- FastCGI就像是一個常駐(long-live)型的CGI程序,它可以一直運行著。其主要行為是將CGI解釋器進程保持在內存中并因此獲得高效的性能。當客戶端請求Web服務器上的動態腳本時,Web服務器會將動態腳本通過TCP協議交給FastCGI主進程,FastCGI主進程根據情況,安排一個空閑的子進程來解析動態腳本,處理完成后將結果返回給Web服務器,Web服務器再將結果返回給客戶端。該客戶端請求處理完畢后,FastCGI子進程并不會隨之關閉,而是繼續等待主進程安排工作任務
- 工作原理:
1. Web Server啟動時載入FastCGI進程管理器(PHP的FastCGI進程管理器是PHP-FPM)
2. FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)并等待來自Web Server的連接。
3. 當客戶端請求到達Web Server時,FastCGI進程管理器選擇并連接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
4. FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。在正常的CGI模式中,php-cgi.exe在此便退出了。
- 優點
1. 從穩定性上看, fastcgi是以獨立的進程池運行來cgi,單獨一個進程死掉,系統可以很輕易的丟棄,然后重新分 配新的進程來運行邏輯。
2. 從安全性上看,Fastcgi支持分布式運算。FastCGI程序也可以和Web服務器分別部署在不同的主機上,它還可以接受來自其他Web服務器的請求。也就是說fastcgi和宿主的server完全獨立, fastcgi宕掉不會影響到server。
3. 從性能上看, fastcgi把動態邏輯的處理從server中分離出來, 大負荷的IO處理留給宿主server, 這樣宿主server可以一心一意處理IO。
### cli運行模式
- 即命令行運行模式,如在終端輸入php a.php運行php文件或者直接輸入 php -r “print\_r(get\_defined\_constants());” 執行php代碼。
### web模塊運行模式
- Web服務器內置模塊,如apache的mod\_ php模塊,微軟iis的ISAPI,nginx的php-fpm,將php解釋器做成模塊加載到服務器中。這樣,隨著服務器的啟動,PHP解釋器模塊也會隨之啟動。Apache的模塊可以在運行的時候動態裝載,這意味著對服務器可以進行功能擴展而不需要重新對源代碼進行編譯,甚至根本不需要停止服務器。我們所需要做的僅僅是給服務器發送信號HUP或者AP\_SIG\_GRACEFUL通知服務器重新載入模塊。但是在動態加載之前,我們需要將模塊編譯成為動態鏈接庫。此時的動態加載就是加載動態鏈接庫。 Apache中對動態鏈接庫的處理是通過模塊mod\_so來完成的,因此mod\_so模塊不能被動態加載,它只能被靜態編譯進Apache的核心,這意味著它是隨著Apache一起啟動的。
> php在Apache中的運行模式 ( web模塊模式)
- 要讓Apache處理并解析php請求,則需要在Apache的配置文件中加入"LoadModule php5\_module dir(php模塊目錄)",以告訴Apache在啟動的時候載入php模塊。
> php在Nginx中的運行模式(FastCGI模式)
- 在Linux中安裝過Nginx的人會知道,如果要讓Nginx服務器處理php請求,還需要安裝php-fpm。PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)就是一個實現了Fastcgi的程序,并且提供進程管理的功能。
## PHP-FPM
### FPM信號處理
fpm的master進程與worker進程之間不會直接通訊,master通過共享內存獲取worker進程信息,比如worker進程當前狀態,已處理請求數等,當master進程要殺掉一個worker進程時則通過發送型號的方式通知worker進程
kill master進程,請求可以正常使用,因為是worker進程直接accept請求
kill worker進程,請求也是可以正常使用的,應為master進程會重新fock出worker進行。
### FPM三種模式
- **pm:static 固定進程模式**。
啟動時master按照pm.max_children配置fork出相應數量的worker進程,即worker進程數是固定不變的。
- **pm:dynamic 動態進程模式**
首先再fpm啟動按照pm.start_servers初始化一定數量的worker,運行期間如果master發現空閑worker數低于pm.min_spare_servers配置數(表示請求比較多,worker處理不多來了),則會forker worker進程,但總的worker數不能超過pm.max_childer,如果master發現空閑worker數超過pm.max_spare_servers(表示閑著的worker太多了),則會殺掉一些worker,避免占用過多資源,master通過這4個值來控制worker數
- **pm:ondemand**
在啟動時不分配worker進程,等到有請求了再通知master進程forker worker進程,總的worker數不超過pm.max_children,處理完成后worker進程不會立即退出,當空閑時間超過pm.process_idle_time后再退出
### FPM模式生命周期

### Fast-cgi協議

- linux 基礎
- ln 鏈接
- linux 環境變量
- linux 進程查看
- nginx
- redis
- redis 安裝
- php 底層原理
- php源碼編譯安裝
- phpize文件
- php命令行
- php7 新特性
- php7 變量
- php7 生命周期
- php sapi運行模式
- php 內存管理
- php 運行機制和Zend虛擬機
- php垃圾回收
- php 基礎
- php.ini
- php函數
- 面向對象
- php 文件上傳
- ob緩沖和頁面靜態化
- php中的session
- php cURL擴展
- composer 應用
- php 錯誤和異常
- thinkphp
- tp6容器和依賴注入
- tp6 的服務
- tp6事件
- tp6 多應用
- tp6路由
- tp6 cache
- tp6 request
- tp6 中間件
- tp6 response
- tp6 Db
- 備忘錄
- 數據庫表