當前位置:才華齋>計算機>php語言>

PHP程式的執行流程怎麼樣

php語言 閱讀(1.51W)

為了以後能開發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;

}

}