自己动手用 C 扩展 PHP(三)- 重要ZEND API函数
2014-07-01 09:11
211 查看
引言:
有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c/c++),而且可以
预先驻留内存的(Apache启动时加载),有了 C/C++ 编写的扩展,我们几乎可以无所不能.
呵呵,Zend 的说明文档少之又少,真令人头疼 :)
———————————————————–
在上两章里讲述了扩展模块的基本用法,相信读者已经能够构建自己的扩展模块了,接下来,我们来看看几个重要的函数:
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 程序建立扩展模块代码框架的时候都自动化帮你实现了这些结构,依照说明填充需要的代码即可.
————————————————-
下章再介绍 php.ini 的配置设定及读取
待续 …
有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c/c++),而且可以
预先驻留内存的(Apache启动时加载),有了 C/C++ 编写的扩展,我们几乎可以无所不能.
呵呵,Zend 的说明文档少之又少,真令人头疼 :)
———————————————————–
在上两章里讲述了扩展模块的基本用法,相信读者已经能够构建自己的扩展模块了,接下来,我们来看看几个重要的函数:
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 程序建立扩展模块代码框架的时候都自动化帮你实现了这些结构,依照说明填充需要的代码即可.
————————————————-
下章再介绍 php.ini 的配置设定及读取
待续 …
相关文章推荐
- 自己动手用C扩展PHP(三)
- 自己动手用C扩展PHP(一)
- 自己动手用C扩展PHP(三)
- 自己动手用C扩展PHP(三)
- 自己动手用 C 扩展 PHP
- 自己动手用C扩展PHP(一)
- 自己动手用 C 扩展 PHP(二)- 函数
- 自己动手用C扩展PHP(三)
- 自己动手用C扩展PHP(二)
- 自己动手用C扩展PHP(二)
- 自己动手用C扩展PHP(二)
- 自己动手用 C 扩展 PHP
- 自己动手用 C 扩展 PHP(一)
- 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
- 使用zend编写php扩展
- 编写自己的php扩展函数
- [研究] 深入PHP内核之ZendAPI扩展篇
- 自己动手写php web server
- 自己写PHP扩展之创建一个普通变量
- 所谓开源,原来是啥软件都要自己来编译——CentOS下php扩展库的安装