php勾子函数,钩子函数

我们知道每一个扩展都有一个zend_module_entry结构,在这个结构中,我们可以定义几个钩子函数,分别对应php的生命周期阶段

```c

/* {{{ hello_module_entry

*/

zend_module_entry hello_module_entry =

{

STANDARD_MODULE_HEADER, // 宏统一设置

"hello", // 扩展名称

hello_functions,

PHP_MINIT(hello),

PHP_MSHUTDOWN(hello),

PHP_RINIT(hello), /* Replace with NULL if there's nothing to do at request start */

PHP_RSHUTDOWN(hello), /* Replace with NULL if there's nothing to do at request end */

PHP_MINFO(hello),

PHP_HELLO_VERSION,

STANDARD_MODULE_PROPERTIES // 宏统一设置

};

/* }}} */

```

通过PHP_MINIT,PHP_MSHUTDOWN,PHP_RINIT,PHP_RSHUTDOWN可以获得钩子函数的地址,zend_module_entry的几个钩子函数对应展开如下:

```c

PHP_MINIT(hello), // 展开后zm_startup_hello

PHP_MSHUTDOWN(hello), // 展开后zm_shutdown_hello

PHP_RINIT(hello), // 展开后zm_activate_hello

PHP_RSHUTDOWN(hello), // 展开后zm_deactivate_hello

```

### 具体钩子函数实现:

#### 模块初始化

可以注册类,常量,并且可以覆盖php编译和执行,从而接管php的编译和执行

```c

// hello.c

PHP_MINIT_FUNCTION(hello)

{

/* If you have INI entries, uncomment these lines

REGISTER_INI_ENTRIES();

*/

return SUCCESS;

}

```

展开后

```c

int zm_startup_hello(int type, int module_number)

{

/* If you have INI entries, uncomment these lines

REGISTER_INI_ENTRIES();

*/

return SUCCESS;

}

```

模块关闭

```c

// hello.c

PHP_MSHUTDOWN_FUNCTION(hello)

{

/* uncomment this line if you have INI entries

UNREGISTER_INI_ENTRIES();

*/

return SUCCESS;

}

```

展开后

```c

int zm_shutdown_hello(int type, int module_number)

{

/* If you have INI entries, uncomment these lines

UNREGISTER_INI_ENTRIES();

*/

return SUCCESS;

}

```

#### 请求初始化

在请求之前被调用

```c

PHP_RINIT_FUNCTION(hello)

{

#if defined(COMPILE_DL_HELLO) && defined(ZTS)

ZEND_TSRMLS_CACHE_UPDATE();

#endif

return SUCCESS;

}

```

展开后:

```c

int zm_activate_hello(int type, int module_number)

{

#if defined(COMPILE_DL_HELLO) && defined(ZTS)

ZEND_TSRMLS_CACHE_UPDATE();

#endif

return SUCCESS;

}

```

#### 请求结束

在请求结束后被调用

```c

PHP_RSHUTDOWN_FUNCTION(hello)

{

return SUCCESS;

}

```

展开后:

```c

int zm_deactivate_hello(int type, int module_number)

{

return SUCCESS;

}

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值