编写扩展模块和其生命周期

时间:2022-02-05 04:38:30

扩展模块

有时候,为了某些原因我们需要自己编写php的扩展库。本篇文章,就是简单说明一下如何编写php的扩展库(在windows上)。

在php的源码目录中,有个ext文件夹。进入里面,可以看到两个文件,ext_skel_win32.php文件,我们使用php执行一下这个文件,就能创建我们的扩展库的基本框架。
比如:
Php –f ext_skel_win32.php –extname=test

执行完这一条命令之后,就会在ext目录下生成一个test文件夹。在这个文件夹中,php已经给我们生成了一个php扩展库的基本框架了。

在这个文件夹中,我们只保留php_test.h、test.c、test.dsp这三个文件,至于其他文件的话,我们直接删除掉就行了。

然后在php_test.php中添加上一行:
PHP_FUNCTION(test_mytest)

然后再在test.c中添加下面这些信息:
在test_functions中添加上函数的声明:


const zend_function_entry test_functions[]={
PHP_FE(confirm_test_compiled,NULL)
PHP_FE(test_mytest,NULL)
PHP_FE_END
}

然后再写上test_mytest的具体实现:


PHP_FUNCTION(test_mytest){
zend_printf("hello world\n");
}

然后编译运行,再在php.ini中设置为:
extension=F:\php-5.3\ext\test.dll

执行命令Php –m可以查看已经加载的模块,可以看到我们的test模块已经加载进来了。

然后再执行我们刚刚写的的函数(php -r “test_mytest();”),可以发现会输出hello world了:

扩展模块已经编写好并且已经集成到php里面去了。Php的生命周期大概如下:
Php被加载
调用每个模块的MINIT(对应test.c中的PHP_MINIT_FUNCTION)
请求
调用每个模块的RINIT(对应test.c中的PHP_RINIT_FUNCTION)
执行目标文件
调用每个模块的RSHUTDOWN(对应test.c中的PHP_RSHUTDOWN_FUNCTION)
收尾工作
调用每个模块的MSHUTDOWN(对应test.c中的PHP_MSHUTDOWN_FUNCTION)
结束

(比如当php作为apache模块的时候,当服务器启动的时候,MINIT就会被执行,当有请求接入的时候RINIT就会被执行,但是MINIT就不会被执行了。如果php是作为cli的话,比如使用php –f test.php,则上面这整一个流程,都会被顺序执行的。)

而我们在const zend_function_entry test_functions[]中声明的函数,则会在模块被启用的时候被注册到PHP内核中,并且是作为内部函数的。

所以在上面可以看到,我们只是在function_entry中注册响应的函数,然后使用PHP_FUNCTION()实现我们的函数功能。

最后当test被加载进php内核中的时候,我们就可以调用我们的函数test_mytest了。