Extending and Embedding PHP-扩展和移植PHP(二)

一个RINIT方法如下:

/* 在每个请求的开始处运行
*/
PHP_RINIT_FUNCTION(myextension)
{
zval *myext_autoglobal;
/* 初始化一个全局变量
* 在MINIT 方法中声明一个空数组,和PHP中的
* $_MYEXTENSION = array()等价;
*/
ALLOC_INIT_ZVAL(myext_autoglobal);
array_init(myext_autoglobal);
zend_hash_add(&EG(symbol_table), "_MYEXTENSION", sizeof("_MYEXTENSION") - 1,
(void**)&myext_autoglobal, sizeof(zval*), NULL);
return SUCCESS;
}


一个请求执行完毕后,要么到达脚本文件结尾,要么遇到exit()方法退出,这时会调用每个扩展的RSHUTDON方法,PHP启动清理进程.RSHUTDOWN和auto_append_file有相似的作用,类似于RINIT和auto_prepend_file关系。RSHUTDOWN和auto_append_file中最主要的不同是,RSHUTDOWN总是会被执行,而auto_append_file如果遇到die()或者exit()会调过。

在变量符号表和资源被释放前,任何有必要执行的代码,都可以放在RSHUTDOWN中执行。所有扩展的RSHUTDOWN方法执行完后,所有变量都会被释放(unset()),在这个过程中,非持久化资源和对象都会被释放。

/* 每个请求的最后执行
*/
PHP_RSHUTDOWN_FUNCTION(myextension)
{
zval **myext_autoglobal;
if (zend_hash_find(&EG(symbol_table), "_MYEXTENSION", sizeof("_MYEXTENSION"),
(void**)&myext_autoglobal) == SUCCESS) {
/* Do something meaningful
* with the values of the
* $_MYEXTENSION array
*/
php_myextension_handle_values(myext_autoglobal TSRMLS_CC);
}
return SUCCESS;

}

最后,当所有请求完成,服务器或者SAPI要关闭时,php依次调用每个扩展的MSHUTDOWN(Model Shutdown)方法,这也是一个扩展最后的机会,去释放在MINIT中申请的资源和内存。


/* 模块卸载
* 变量和方法被自动移除,
* 资源,类和流被去除
*/
PHP_MSHUTDOWN_FUNCTION(myextension)
{
UNREGISTER_INI_ENTRIES();
php_unregister_url_stream_wrapper ("myproto" TSRMLS_CC);
php_stream_filter_unregister_factory ("myfilter" TSRMLS_CC);
return SUCCESS;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值