PHP核心介紹及擴充套件開發指南—類和物件

技術小美發表於2017-11-15

類和物件(TODO)

附錄A.       Extension的編譯

Extension的編譯是比較簡單的,下面是個示例Makefile:

 

  1. # 擴充套件搜尋目錄,模組被放到這裡才能被找到和載入  
  2. # 可以從php.ini中的extension_dir命令獲取該值  
  3. PHP_EXT_HOME=/home/wiki/php5/lib/php/extensions/  
  4. # PHP原始碼路徑  
  5. PHP_SRC=/home/wiki/wikienv/install/php-5.2.3  
  6. INCLUDE=-I$(PHP_SRC) -I$(PHP_SRC)/main -I$(PHP_SRC)/TSRM -I$(PHP_SRC)/Zend  
  7. CC=gcc 
  8.  
  9. all: first_module.so  
  10.  
  11. first_module.so: first_module.o  
  12.     $(CC) -shared -rdynamic -o first_module.so first_module.o  
  13.  
  14. # 注意不要忘了“-DCOMPILE_DL_FIRST_MODULE=1”,否則不會匯出get_module()  
  15. first_module.o: first_module.c  
  16.     $(CC) -fpic -DCOMPILE_DL_FIRST_MODULE=1 $(INCLUDE) -c first_module.c  
  17.  
  18. clean:  
  19.     rm -fr *.so *.o  
  20.  
  21. install: first_module.so  
  22.     cp -fp first_module.so $(PHP_EXT_HOME) 

這將建立一個可動態載入的Extension模組,如果想將Extension靜態編譯進PHP,就需要使用PHP本身的編譯系統,這裡不作介紹。

另外,Zend提供了一個小指令碼來簡化建立和編譯Extension的過程,可以在《PHP手冊》的相關章節找到其使用方法。

目前,Zend正在開發一個更加完善和標準的Extension生成工具,可以在這裡找到它:http://pecl.php.net/package/PECL_Gen

附錄B.       Extension的載入過程

Extension有兩種載入方式,通過php.ini在啟動時載入或是通過dl()函式在執行時載入,前者需在php.ini中新增一行命令:extension=myext.so。這兩種方式最後都將呼叫一個名為php_ld()的內部函式。

php_ld()首先呼叫系統例程載入動態庫,之後解析並執行get_module()函式來獲得模組的zend_module_entry結構(參見2.1.3)。

然後,呼叫函式zend_register_module_ex()來註冊模組,這個函式先將模組的zend_module_entry加入到一個名為module_registry的HashTable中,然後呼叫zend_register_functions將模組匯出的函式加入CG(function_table)(參見2.5)這個HashTable中,這樣我們就可以呼叫模組匯出的函式了。最後,php_ld()將呼叫模組的啟動函式(參見2.4)來初始化模組。

如果模組是dl()動態載入的,Zend還將接著呼叫模組的啟用函式,因為當前顯然有頁面在執行。

最後要說明的是,通過dl()載入的模組稱為“臨時模組”,在頁面執行完畢時將被解除安裝,同時,其建立的常量和資源也將被銷燬。

 

本文轉自百度技術51CTO部落格,原文連結:http://blog.51cto.com/baidutech/743768,如需轉載請自行聯絡原作者


相關文章