PHP程序的執行流程怎麼樣

來源:文萃谷 1.43W

為了以後能開發PHP擴展,就一定要了解PHP的執行順序。這篇文章就是為C開發PHP擴展做鋪墊。

PHP程序的執行流程怎麼樣

Web環境我們假設為Apache。在編譯PHP的時候,為了能夠讓Apache支持PHP,我們會生成一個mod_的模塊。Apache加載這個模塊,在url訪問文件的時候,就會轉給mod_模塊來處理。這個就是我們常説的SAPI。英文名字是:Server Application Programming Interface。SAPI其實是一個統稱,其下有 ISAPI,CLI SAPI,CGI等。有了它,就可以很容易的跟其他東西交互,比如APACHE,IIS,CGI等。

Apache啟動後會將mod_模塊的hook handler註冊進來,當Apache檢測到訪問的url是一個php文件時,這時候就會把控制權交給SAPI。進入到SAPI後,首先會執行sapi/apache/mod_php5.c 文件的_init_handler函數,這裏摘錄一段代碼:

static void php_init_handler(server_rec *s, pool *p)

{

register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);

if (!apache_php_initialized) {

apache_php_initialized = 1;

#ifdef ZTS

tsrm_startup(1, 1, 0, NULL);

#endif

sapi_startup(&apache_sapi_module);

php_apache_startup(&apache_sapi_module);

}

#if MODULE_MAGIC_NUMBER >= 19980527

{

TSRMLS_FETCH();

if (PG(expose_php)) {

ap_add_version_component("PHP/" PHP_VERSION);

}

}

#endif

}

該函數主要調用兩個函數:sapi_startup(&apache_sapi_module); php_apache_startup(&apache_sapi_module);

SAPI_API void sapi_startup(sapi_module_struct *sf)

{

sf->ini_entries = NULL;

sapi_module = *sf;

.................

sapi_globals_ctor(&sapi_globals);

................

virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */

..................

reentrancy_startup();

}

sapi_startup創建一個 sapi_globals_struct結構體。sapi_globals_struct保存了Apache請求的基本信息,如服務器信息,Header,編碼等。sapi_startup執行完畢後再執行php_apache_startup。

static int php_apache_startup(sapi_module_struct *sapi_module)

{

if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {

return FAILURE;

} else {

return SUCCESS;

}

}

熱門標籤