PHP程序的執行流程怎麼樣
為了以後能開發PHP擴展,就一定要了解PHP的執行順序。這篇文章就是為C開發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;
}
}
-
PHP 數組和字符串互相轉換實現方法
PHP數組和字符串互相轉換是比較常用的,下面給大家介紹PHP數組和字符串互相轉換實現方法,一起來了解一下吧!PHP數組和字符串互相轉換實現方法PHP中由於數組和字符串這兩種變量類型是如此常用,以至於PHP具有兩個函數,可以在字符串和數組之間互相進行轉換代碼如下:$ar...
-
PHP的漏洞-如何防止PHP漏洞
漏洞無非這麼幾類,XSS、sql注入、命令執行、上傳漏洞、本地包含、遠程包含、權限繞過、信息泄露、cookie偽造、CSRF(跨站請求)等。下面是小編為大家帶來的關於PHP的漏洞的知識,歡迎閲讀。+sql注入其中佔大頭的自然是XSS與SQL注入,對於框架類型或者有公共文件的,建...
-
PHP考試筆試題
用寶珠打扮自己,不如用知識充實自己。以下是小編為大家搜索整理的PHP考試筆試題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!1、{PHP題目}標識符是變量的名稱。PHP中的標識符用$+變量名來表示。標識符在PHP中遵循下列選項中的那些規則?()...
-
如何實現yii2 數據庫讀寫分離配置
導語:開始使用數據庫首先需要配置數據庫連接組件,下面小編給大家提供瞭如何實現yii2數據庫讀寫分離配置,大家可以參考閲讀,更多詳情請關注應屆畢業生考試網。開始使用數據庫首先需要配置數據庫連接組件,通過添加db組件到應用配置實現("基礎的"Web應用是config/),DSN(Da...