我們知道每一個擴展都有一個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;
}
```
- php
- 編譯安裝
- 基本概念
- 垃圾回收機制
- 生命周期
- zval底層實現
- c擴展開發
- gdb調試工具
- 自定義擴展簡單demo
- 鉤子函數
- 讀取php.ini配置
- 數組
- 函數
- 類
- yaf擴展底層源碼
- swoole擴展底層源碼
- memoryGlobal內存池
- swoole協程使用記錄
- 單點登錄sso原理
- compser使用
- session實現機制
- c & linux
- gcc
- 指針
- 結構體,聯合和位字段
- 宏定義井號說明
- printf家族函數和可變參數
- 共享函數
- 靜態庫和動態庫
- makefile自動化構建
- 信號一
- 信號二
- inotify監控文件事件
- socket編程
- 簡介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路復用
- 內存管理
- 進程組,會話和控制終端
- daemon守護進程
- 多進程
- 多線程
- 常用進制轉換
- go
- 入門知識
- 字節和整數裝換
- python
- redis
- 應用場景
- 消息隊列
- 熱點數據
- 掃碼登錄
- 訂閱發布
- 次數限制
- 搶購超賣
- 持久化機制
- mysql
- 工作流程
- MyISAM和InnoDB區別
- 用戶和權限管理
- 執行計劃
- sql優化
- 事務和鎖
- 慢查詢日志
- case...when...then...end用法
- sql
- 參考
- linux
- 內核參數優化
- 防火墻設置
- docker
- docker入門知識
- 算法
- 多維數組合
- DFA算法
- 紅包金額分配