PHP核心介紹及擴充套件開發指南―類和物件
類和物件(TODO)
附錄A. Extension的編譯
Extension的編譯是比較簡單的,下面是個示例Makefile:
# 擴充套件搜尋目錄,模組被放到這裡才能被找到和載入 # 可以從php.ini中的extension_dir命令獲取該值 PHP_EXT_HOME=/home/wiki/php5/lib/php/extensions/ # PHP原始碼路徑 PHP_SRC=/home/wiki/wikienv/install/php-5.2.3 INCLUDE=-I$(PHP_SRC) -I$(PHP_SRC)/main -I$(PHP_SRC)/TSRM -I$(PHP_SRC)/Zend CC=gcc all: first_module.so first_module.so: first_module.o $(CC) -shared -rdynamic -o first_module.so first_module.o # 注意不要忘了“-DCOMPILE_DL_FIRST_MODULE=1”,否則不會匯出get_module() first_module.o: first_module.c $(CC) -fpic -DCOMPILE_DL_FIRST_MODULE=1 $(INCLUDE) -c first_module.c clean: rm -fr *.so *.o install: first_module.so 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()載入的模組稱為“臨時模組”,在頁面執行完畢時將被解除安裝,同時,其建立的常量和資源也將被銷燬。