什麼是sapi
首先看一下他的工作原理:
無論是cgi還是apache的mod_php、cli都是按sapi_module_struct結構實現的,這種做法遮蔽了php的不同實現,於是外部程式通過呼叫sapi介面的sapi_module_struct介面就可以無差別的呼叫不同的底層php程式。sapi_module_struct結構如下:
struct _sapi_module_struct ;
以mod_php為例
ap_module_declare_data module php5_module = ;
著重看php_ap2_register_hook這個鉤子:
void php_ap2_register_hook(apr_pool_t *p)
ap_hook_post_config這個鉤子在apache啟動時呼叫php_apache_server_startup函式
,然後函式內呼叫sapi_startup啟動sapi。通過各模組mint()函式初始化模組,ap_hook_handler會在請求到來時執行php_handler函式,函式內再呼叫php_apache_request_ctor,執行rmint()操作
其他模式如cli、php-cgi等模式下,sapi_startup()函式是定義在int main主函式中,即直接執行就開始建立php程式,而mod_php一開始並不需執行,等到請求到來時會自動開始建立php程式。啟動sapi後,php程式會再呼叫sapi_module中的startup函式指標,完成相應模式下php的建立工作。
cgi模式下的startup函式為php_cgi_startup,該函式再直接呼叫通用的php_module_stratup(&sapi_module)完成php建立,初始化zend引擎。
總結來說sapi定義了一種面向介面程式設計的規範,而php-cli、php-cgi等則是實現了該規範的程式
待續。。。。。。
注:sapi_module_struct、sapi_startup()定義在sapi.c中
php_module_startup()定義在main.c中
人們常說的頻寬是什麼意思?
網上查了下人們常說的頻寬 bandwidth 又可以稱為頻寬,是指在固定的時間可傳輸的資料數量,亦即在傳輸管道中可以傳遞資料的能力。通常指訊號所佔據的頻頻寬度 在被用來描述通道時,頻寬是指能夠有效通過該通道的訊號的頻頻寬度。很多人都會把頻寬和寬頻二者的關係給搞混了,這裡簡單的給大家說下二者的區別 頻...
PHP 的 SAPI 是個什麼東西
這是 php 核心提供給外部呼叫其服務的介面,即外部系統可以通過 sapi 來呼叫 php 提供的編譯指令碼 執行指令碼的服務。php 中實現的 sapi 有很多,cli fpm是我們比較常見的。從下圖可以較為清晰的理解外部系統是如何通過 sapi 呼叫 php 服務的 於網路 接下來主要是討論下我...
Java 中常說的常量池到底是什麼
class 檔案常量池指的是編譯生成的 class 位元組碼檔案,其結構中有一項是常量池 constant pool table 用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後進入方法區的執行時常量池中存放。什麼是字面量和符號引用?執行時常量池是方法區的一部分,是一塊記憶體區域。c...