PHP底層探索(一):幾種常見的SAPI

SAPI: Server Application Programming Interface 服務器端應用編程端口.即php與其他應用交互的接口.

常用的SAPI有:cgi fast-cgi cli apache的DLL

CGI
CGI即通用網關接口(Common Gateway Interface),他是一段程序,通俗的講CGI就像是一座橋,把網頁和web服務器中的執行程序連接起來,CGI把html接收的指令傳給服務器執行程序,再把服務器處理的結果返回 給html頁面.
CGI方式在發現用戶的連接請求時,先創建CGI進程,並使用,然後進行處理,處理完成後結束該子進程.(fork-and-execute),所以使用CGI方式的服務器有多少請求就會創建多少子進程,子進程反覆加載是CGI系能低的主要原因.當用戶請求非常多時,會佔用大量的系統資源.

Fast-CGI
更像是CGI的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行者,只要激活後,不會每次都花時間fork一次.php使用php-fpm(FastCGI Process Manager) 全稱PHP FastCGI進程管理器進行管理.
fastcgi的工作原理
Web Server啓動時掛載php-fpm並初始化,啓動多個FastCGI解釋器進程,並等待Web Server的連接.
當連接到Web Server時,php-fpm選擇並連接到一個CGI解釋器,Web Server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi.子進程完成處理後,將標準輸出和錯誤信息,返回給Web Server . 當子進程關閉鏈接是,請求便算是完成. 子進程接着等待並處理來自php-fpm的下一個連接.在CGI模式中,子進程便在這結束了.
在上述過程中,可以想到CGI有多慢,每一個請求php都必須解析php.ini 重新載入全部擴展,並重新初始化全部數據結構,使用FastCGI,所有這些只會在啓動時載入一次,並且,持續數據庫連接*(Persistent database connection)* 可以工作.

APACHE2HANDLER
php作爲apache模塊,apache服務器在系統啓動後,會預先創建多個進程副本駐留內存,等待連接出現,一旦有請求,就立即使用空閒的子進程進行處理,這樣就不存在生成子進程時的延遲.這些服務器副本在處理完成後,不退出,而是繼續等待請求出現,反應更快,性能更高.

CLI

1.完全支持多線程
2.可實現定時任務
3.linux下可用php編寫shell腳本
(經常用的東西,還不知道有這麼多參數..)
使用PHP CLI傳遞腳本參數的形式:
-a 交互式運行Run interactively
-c path 從path讀取php的.ini文件
-n 不用讀取php的.ini文件就直接運行
-m 列出經過編譯的模塊
-i 顯示有關PHP構建的信息
-l 檢查PHP腳本的句法
-s 以彩色方式顯示源代碼
-w 顯示去掉註釋之後的源代碼
-h 顯示幫助

至此,我對SAPI有了一定的認識
想了解更多,可以看官方手冊:http://php.net/manual/zh/features.commandline.php

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