PHP核心剖析 常見的SAPI及Embed

2021-09-17 22:29:38 字數 2471 閱讀 1805

參考文獻: 、《php7核心剖析》秦鵬/著

sapi提供了乙個和外部通訊的介面,常見的sapi有:cgi 、fast-cgi、cli、isapi、apache 模組的 dll

目錄

1、常見的sapi介紹

2、embed

2.1  php_embed_init()

2.2  php_embed_shutdown()

cgi

cgi即通用閘道器介面(common gateway inte***ce),一段把網頁和web伺服器中的執行程式連線起來的程式。它把html接收的指令傳遞給伺服器執行程式,再把伺服器執行程式的結果返還給html頁。cgi的跨平台性也極強,幾乎能在任何作業系統上執行。

cgi在遇到使用者連線請求時要先建立cgi的子程序,然後處理請求,處理完後結束這個子程序。這就是fork-and-execute模式。不過有多少連線請求就有多少cgi子程序,會造成資源的擁擠。

fast-cgi

cgi的公升級版本,常住型的cgi,前面介紹過。php的fpm就是fastcgi process manager,全稱為php fastcgi程序管理器。fastcgi的工作原理:

(1)web server啟動時載入fastcgi程序管理器(iis isapi或apache module)

(2)fastcgi程序管理器自身初始化,啟動多個cgi直譯器程序(可見多個php-cgi)並等待來自web server的連線。

(3)當客戶端請求到達web server時,fastcgi程序管理器選擇並連線到乙個cgi直譯器。web server將cgi環境變數和標準輸入傳送到fastcgi子程序php-cgi。

(4)fastcgi子程序完成處理後將標準輸出和錯誤資訊從同一連線返回web server。當fastcgi子程序關閉連線時,請求便告處理完成。fastcgi子程序接著等待並處理來自fastcgi程序管理器(執行在web server中)的下乙個連線。 在cgi模式中,php-cgi在此便退出了。

在上述情況中,你可以想象cgi通常有多慢。每乙個web 請求php都必須重新解析php.ini、重新載入全部擴充套件並重初始化全部資料結構。使用fastcgi,所有這些都只在程序啟動時發生一次。乙個額外的 好處是,持續資料庫連線(persistent database connection)可以工作。

apache2handler

php作為apache模組,apache伺服器在系統啟動後,預先生成多個程序副本駐留在記憶體中,一旦有請求出現,就立即使用這些空餘的子程序進行處理,這樣就不存在生成子程序造成的延遲了。這些伺服器副本在處理完一次http請求之後並不立即退出,而是停留在計 算機中等待下次請求。對於客戶瀏覽器的請求反應更快,效能較高。

apache模組的dll:

該執行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模組化(dll)中,php是與web伺服器一起啟動並執行的。(是apache在cgi的基礎上進行的一種擴充套件,加快php的執行效率)

isapi:cli:在windows下使用cli模式從命令列進入www目錄,然後執行。

embed

如果我們自己的第三方程式想使用php,那麼我們就需要這類sapi,它在編譯後就是普通的庫檔案(可以選擇編譯為靜態庫、共享庫),我們可以在其它c/c++應用中呼叫php提供的api,甚至可以提供給其它語言處理。

編譯php時通過 --enable-embed=[shared|static]指定庫型別,預設是共享庫。編譯之後可以在php安裝位置的/lib目錄下看到生成的庫檔案,同時在/include/php/sapi目錄下會生成乙個存放embed標頭檔案的目錄。

embed的實現邏輯非常簡單,只是把php生命週期的幾個處理函式進行了封裝,它對外提供了兩個api。

這個介面主要進行php框架的初始化操作,比如tsrm、初始化sapi、初始化訊號處理,另外它還完成了非常重要的兩個操作,那就是php_module_startup()、php_request_startup()。

embed_sapi_api int php_embed_init(int argc, char **ar**)

...//請求request startup階段

if (php_request_startup()==failure)

...}

在第三方應用中嵌入php時首先需要呼叫這個介面,然後就可以使用php/zend提供的api完成php指令碼的執行了。

此介面與php_embed_init()對應,主要完成php框架的關閉收尾工作,包括request shutdown、module shutdown兩個階段的操作。

embed_sapi_api void php_embed_shutdown(void)

}

PHP7核心剖析 SAPI簡析

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

PHP常見的四種執行模式 SAPI

sapi提供了乙個和外部通訊的介面,常見的sapi有 cgi fast cgi cli apache模組的dll isapi cgi 即通用閘道器介面 commom gateway inte ce 它把網頁和web伺服器中的執行程式連線起來,把從html接收的指令傳遞給伺服器的執行程式,再把伺服器執...

PHP核心剖析 物件導向

作為一名程式猿,你們是不是經常會看到這樣的乙個笑話 程式猿a 沒物件啊,好煩啊,難道程式猿真的不配擁有物件嘛?程式猿b 啊,沒物件,new乙個不就好了 這個笑話是不是經常聽到呢?那你真的知道 物件 這個東西嘛?你知道 類 嘛?你知道 物件 與 類 之間是什麼關係嘛?而我們經常說的 物件導向 你又真正...