如何理解PHP程序執(zhí)行的過程原理_第1頁
如何理解PHP程序執(zhí)行的過程原理_第2頁
如何理解PHP程序執(zhí)行的過程原理_第3頁
如何理解PHP程序執(zhí)行的過程原理_第4頁
如何理解PHP程序執(zhí)行的過程原理_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第如何理解PHP程序執(zhí)行的過程原理目錄概述加載php.ini配置加載php內置擴展

概述

Web環(huán)境我們假設為Apache。在編譯PHP的時候,為了能夠讓Apache支持PHP,我們會生成一個mod_php5.so的模塊。Apache加載這個模塊,在url訪問.php文件的時候,就會轉給mod_php5.so模塊來處理。

這個就是我們常說的SAPI。英文名字是:ServerApplicationProgrammingInterface。SAPI其實是一個統(tǒng)稱,其下有ISAPI,CLISAPI,CGI等。有了它,就可以很容易的跟其他東西交互,比如APACHE,IIS,CGI等。

Apache啟動后會將mod_pho5.so模塊的hookhandler注冊進來,當Apache檢測到訪問的url是一個php文件時,這時候就會把控制權交給SAPI。進入到SAPI后,首先會執(zhí)行sapi/apache/mod_php5.c文件的php_init_handler函數,

這里摘錄一段代碼:

staticvoidphp_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;

#ifdefZTS

tsrm_startup(1,1,0,NULL);

#endif

sapi_startup(apache_sapi_module);

php_apache_startup(apache_sapi_module);

#ifMODULE_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);

staticintphp_apache_startup(sapi_module_struct*sapi_module)

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

returnFAILURE;

}else{

returnSUCCESS;

}

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

staticintphp_apache_startup(sapi_module_struct*sapi_module)

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

returnFAILURE;

}else{

returnSUCCESS;

}

php_module_startup內容太多,這里介紹一下大致的作用:

1.初始化zend_utility_functions結構.這個結構是設置zend的函數指針,比如錯誤處理函數,輸出函數,流操作函數等.

2.設置環(huán)境變量.

3.加載php.ini配置.

4.加載php內置擴展.

5.寫日志.

6.注冊php內部函數集.

7.調用php_ini_register_extensions,加載所有外部擴展

8.開啟所有擴展

9.一些清理操作.

重點說一下3,4,7,8

加載php.ini配置

if(php_init_config(TSRMLS_C)==FAILURE){

returnFAILURE;

}

php_init_config函數會在這里檢查所有php.ini配置,并且找到所有加載的模塊,添加到php_extension_lists結構中。

加載php內置擴展

調用zend_register_standard_ini_entries加載所有php的內置擴展,如array,mysql等。

調用php_ini_register_extensions,加載所有外部擴展

main/php_ini.c

voidphp_ini_register_extensions(TSRMLS_D)

zend_llist_apply(extension_lists.engine,php_load_zend_extension_cbTSRMLS_CC);

zend_llist_apply(extension_lists.functions,php_load_php_extension_cbTSRMLS_CC);

zend_llist_destroy(extension_lists.engine);

zend_llist_destroy(extension_lists.functions);

}

zend_llist_apply函數遍歷extension_lists執(zhí)行回調函數php_load_php_extension_cb

staticvoidphp_load_zend_extension_cb(void*argTSRMLS_DC)

zend_load_extension(*((char**)arg));

}

該函數最后調用

if((module_entry=zend_register_module_ex(module_entryTSRMLS_CC))==NULL){

DL_UNLOAD(handle);

returnFAILURE;

}

將擴展信息放到Hash表module_registry中,Zend/zend_API.c

if(zend_hash_add(module_registry,lcname,name_len+1,(void*)module,sizeof(zend_module_entry),(void**)module_ptr)==FAILURE){

zend_error(E_CORE_WARNING,"Module\'%s'alreadyloaded",module-name);

efree(lcname);

returnNULL;

}

最后,zend_startup_modules(TSRMLS_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論