自己动手用C扩展PHP(三)
在上兩章里講述了擴展模塊的基本用法,相信讀者已經(jīng)能夠構(gòu)建自己的擴展模塊了,接下來,我們來看看幾個重要的函數(shù):
?
1、PHP_MINIT_FUNCTION(MyModule);
?
當模塊被Zend Engine(ZE)加載后,例如Apache啟動,加載了PHP模塊,ZE會對每一個擴展模塊調(diào)用此函數(shù)(如果有的話),可以在該函數(shù)里進行一些初始化操作。
?
2、PHP_RINIT_FUNCTION(MyModule);
?
對于每一個“使用”該模塊的PHP腳本請求前,都執(zhí)行該函數(shù)(如果有的話),最好的例子:Session擴展模塊,如果在一個PHP腳本里執(zhí)行session.start(),Session模塊的PHP_RINIT_FUNCTION()將被調(diào)用。詳情可以看看session模塊的源代碼。
?
3、PHP_RSHUTDOWN_FUNCTION(MyModule);
?
與PHP_RINIT_FUNCTION()相反,該函數(shù)是在一個PHP腳本執(zhí)行完畢后執(zhí)行。
?
4、PHP_MSHUTDOWN_FUNCTION(MyModule);
?
當ZE收到shutdown信號后,例如apache卸載PHP模塊,ZE對每一個模塊調(diào)用此函數(shù),最后關(guān)閉自己的核心子系統(tǒng)。
?
---------------------------------------------
?
如何使用以上的函數(shù)?
?
首先,在頭文件("mymodule.h")里聲明:
?
PHP_MINIT_FUNCTION(MyModule);
PHP_MSHUTDOWN_FUNCTION(MyModule);
PHP_RINIT_FUNCTION(MyModule);
PHP_RSHUTDOWN_FUNCTION(MyModule);
?
然后在你的“mymodule.c”里實現(xiàn)zend_module_entry結(jié)構(gòu):
?
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
};
?
// 實現(xiàn) PHP_MINIT_FUNCTION() 等等 ...
PHP_MINIT_FUNCTION(MyModule)
{
????// 你的實現(xiàn)代碼 ...
????return SUCCESS;
}
其實ext目錄下的ext_skel程序建立擴展模塊代碼框架的時候都自動化幫你實現(xiàn)了這些結(jié)構(gòu),依照說明填充需要的代碼即可。
來源:http://www.cnblogs.com/moodlxs/archive/2011/09/21/2345382.html
總結(jié)
以上是生活随笔為你收集整理的自己动手用C扩展PHP(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache启动过程(PHP_MINIT
- 下一篇: PHP源码分析-PHP的生命周期