【PHP7內核剖析】——SAPI簡析

前言:首先,從個人的角度來說一下關於SAPI這章吧!這章內容大多其實是講了一些C語言的函數實現部分,之前若是沒有C基礎的同學,看起來可能會比較喫力,所以我的建議是,不用去通讀裏面的關鍵代碼,首先我們對這些函數有一個影響,知道一個大概即可,後期有時間可以先了解一下C之後,再過來開這塊,個人感覺會比較輕鬆!!!


先來說一下什麼是SAPI?

SAPI是服務端應用層的接口,即PHP與其他應用交互的接口。要執行PHP腳本有很多種方式,例如通過Web服務器,或者直接在命令行下,也可以嵌入在其他程序中。

在PHP中SAPI常見的有四種,即cli,CGI,FPM,embed

1.cli:英文:command-line interface,翻譯過來就是“命令行接口”。它在PHP中主要是用來方便直接運行php文件的,當你想做簡單的調試的時候,這種方式無疑是最好的選擇了。再來說一下cli內部的機制。首先cli是單進程模式,也就是說,cli請求完就關閉了。再來說他的生命週期,這個我在上篇文章中就說到了,沒看的同學請移步傳送門。那cli也是按照這個生命週期去執行的:                                                   

2.CGI:

CGI (Commom Gateway Interface),通用網關接口,它把網頁和WEB服務器中的執行程序連接起來,把從HTML接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給HTML頁。CGI的跨平臺性能極佳,幾乎可以在任何操作系統上實現。CGI方式在遇到連接請求先要創建CGI的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi方式的服務器有多少連接請求就會有多少cgi子進程,子進程反覆加載是CGI性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠佔系統的資源如內存,CPU時間等,造成效能低下。

3.FPM:(FastCGI Process Manager),PHP FastCGI 進程管理器。說到FPM,就不得不先說一下fastCGI。首先來說,fastcgi本質是一個類似於http的協議,在PHP中它配合web一起實現http請求。FastCGI 是 CGI的升級版本,FastCGI可以看成是一個常駐型的CGI,它可以一直執行着,只要激活後,不會每次都要花費時間去fork一次。接着說FPM,FPM是怎麼去管理進程的呢?首先在初始化的時候,它會生成一個master主進程與多個worker子進程。master主要用來管理worker進程,而worker進程則用來處理請求。master在管理worker的時候,會用3種不同的策略去管理:static(靜態),dynamic(動態),ondemand(按需)。static是每次fork固定的子進程(pm.max_children起始php-fpm進程數量);dynamic是動態的去fork子進程(pm.start_servers:起始php-fpm進程數量pm.min_spare_servers:最小php-fpm進程數pm.max_spare_servers:最大php-fpm進程數量);ondemand就是你需要多少就fork多少子進程。值得注意的是,當子進程過多的時候,master也會去kill掉部分子進程,kill的策略是最長時間沒有使用到的子進程,而且每個週期只能kill一個,若是空餘子進程較多的話,也是一個週期kill一個子進程的!

4.embed:嵌入,主要是用來將PHP作爲接口向第三方提供的。編譯PHP時通過 --enable-embed=[shared|static]指定庫類型,默認是共享庫。

 

小結:cli主要用於命令行,fpm主要用於web端應用,emben主要用於第三方語言或者應用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章