在上兩章裡講述了擴充模組的基本用法,相信讀者已經能夠構建自己的擴充模組了,接下來,我們來看看幾個重要的函數:
1、PHP_MINIT_FUNCTION(MyModule);
當模組被Zend Engine(ZE)載入後,例如Apache啟動,載入了PHP模組,ZE會對每一個擴充模組調用此函數(如果有的話),可以在該函數裡進行一些初始化操作。
2、PHP_RINIT_FUNCTION(MyModule);
對於每一個“使用”該模組的PHP指令碼請求前,都執行該函數(如果有的話),最好的例子:Session擴充模組,如果在一個PHP指令碼裡執行session.start(),Session模組的PHP_RINIT_FUNCTION()將被調用。詳情可以看看session模組的原始碼。
3、PHP_RSHUTDOWN_FUNCTION(MyModule);
與PHP_RINIT_FUNCTION()相反,該函數是在一個PHP指令碼執行完畢後執行。
4、PHP_MSHUTDOWN_FUNCTION(MyModule);
當ZE收到shutdown訊號後,例如apache卸載PHP模組,ZE對每一個模組調用此函數,最後關閉自己的核心子系統。
---------------------------------------------
如何使用以上的函數?
首先,在標頭檔("mymodule.h")裡聲明:
PHP_MINIT_FUNCTION(MyModule);
PHP_MSHUTDOWN_FUNCTION(MyModule);
PHP_RINIT_FUNCTION(MyModule);
PHP_RSHUTDOWN_FUNCTION(MyModule);
然後在你的“mymodule.c”裡實現zend_module_entry結構:
zend_module_entry MyModule_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"MyModule",
MyModule_functions,
PHP_MINIT(MyModule),
PHP_MSHUTDOWN(MyModule),
PHP_RINIT(MyModule),
PHP_RSHUTDOWN(MyModule),
NULL,
#if ZEND_MODULE_API_NO >= 20010901
"0.1",
#endif
STANDARD_MODULE_PROPERTIES
};
// 實現 PHP_MINIT_FUNCTION() 等等 ...
PHP_MINIT_FUNCTION(MyModule)
{
// 你的實現代碼 ...
return SUCCESS;
}
其實ext目錄下的ext_skel程式建立擴充模組代碼架構的時候都自動化幫你實現了這些結構,依照說明填充需要的代碼即可。