ISAPI、CGI、FASTCGI、PHP-FPM與執行緒安全、執行緒非安全
阿新 • • 發佈:2019-02-05
ISAPI:Internet Server Application Programming Interface,是種協議,對應語言的實現就是對應的伺服器擴充套件(以動態連結庫dll形式存在)。一個ISAPI的DLL,可以在被使用者請求啟用後長駐記憶體,等待使用者的另一個請求,還可以在一個DLL裡設定多個使用者請求處理函式,此外,ISAPI的DLL應用程式和WWW伺服器處於同一個程序中,效率要顯著高於CGI。而且加上輔助工具如ISAPI篩選器,可以將請求先過濾再響應。遺憾的是,ISAPI實現時要用到微軟api,所以跨平臺性差,只能在 IIS(InternetInformationServer)和MSpersonalwebserver以及NTworkstation上的 peerwebserver上用。
apache模組dll也是類似原理,語言環境隨伺服器一起啟動,常駐記憶體減少消耗。
注:IIS上一般我們會把PHP配置成以ISAPI的方式來執行,ISAPI是多執行緒的方式,這樣就快多了。但存在一個問題,很多常用的PHP擴充套件是以Linux/Unix的多程序思想來開發的,這些擴充套件在ISAPI的方式執行時就會出錯搞垮伺服器。因此在IIS下CGI模式才是PHP執行的最安全方式,但CGI模式對於每個HTTP請求都需要重新載入和解除安裝整個PHP環境,其消耗是巨大的。
FastCGI:為了兼顧IIS下PHP的效率和安全,微軟給出了FastCGI的解決方案。同ISAPI原理有些類似,就是減少CGI初始化等前置操作的消耗。FastCGI可以讓PHP的程序重複利用而不是每一個新的請求就重開一個程序。同時FastCGI也可以允許幾個程序同時執行。這樣既解決了CGI程序模式消耗太大的問題,又利用上了CGI程序模式不存線上程安全問題的優勢。那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟一個master,解析配置檔案,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。要說明的是FastCGI本身僅僅是種協議,php-fpm是其中一種實現,來管理cgi程式,其操作比如:
--start 啟動php的fastcgi master程序
--stop 強制終止php的fastcgi master程序
--quit 平滑終止php的fastcgi master程序
--restart 重啟php的fastcgi master程序
--reload 重新平滑載入php的php.ini
--logrotate 重新啟用log檔案
(高版本的php-fpm是一個二進位制程式,只能接收 sign 訊號,不能使用這種方式了)
補充說明:一個程序呼叫fork()函式後,系統先給新的程序分配資源,例如儲存資料和程式碼的空間。然後把原來的程序的所有值都複製到新的新程序中,只有少數值與原來的程序的值不同,相當於克隆了一個自己。
從2000年10月20日釋出的第一個Windows版的PHP3.0.17開始的都是執行緒安全的版本,這是由於與Linux/Unix系統是採用多程序的工作方式,不同的是Windows系統是採用多執行緒的工作方式。如果在IIS/Nginx/Apache下以CGI方式執行PHP會非常慢,這是由於CGI模式是建立在多程序的基礎之上的,而非多執行緒。
根據上述幾種執行方式的說明可知,如果是使用ISAPI的方式來執行PHP就必須用Thread Safe(執行緒安全)的版本;而用FastCGI模式執行PHP的話就沒有必要用執行緒安全檢查了,用None Thread Safe(NTS,非執行緒安全)的版本能夠更好的提高效率。