Skip to content

Commit 7b8579e

Browse files
committed
ini 原理分析
1 parent c1b2cda commit 7b8579e

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

book/chapt11/11-04-00-ini-set.markdown

+24
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,30 @@
1616

1717
### 声明
1818

19+
`PHP_INI_ENTRY`
20+
21+
[c]
22+
/* main/php_ini.h */
23+
#define PHP_INI_ENTRY ZEND_INI_ENTRY
24+
/* Zend/zend_ini.h */
25+
ZEND_INI_ENTRY(name, default_value, modifiable, on_modify)
26+
27+
参数 |描述
28+
--------------|------------------------------------------------
29+
name |ini 指令名
30+
default_value |默认值
31+
modifiable |ini 指令可以被修改的位域
32+
on_modify |修改 ini 指令的回调函数
33+
34+
modifiable 可分为四种状态机:
35+
36+
* ZEND_INI_USER 能够被用户脚本更改
37+
* ZEND_INI_PERDIR 能够在 .htaccess中更改
38+
* ZEND_INI_SYSTEM 能够在php.ini或http.conf等系统文件更改
39+
* ZEND_INI_ALL 能在所有地方更改
40+
41+
关于 `on_modify` 参数的使用在下一小节使用 `STD_PHP_INI_ENTRY` 宏中使用
42+
1943
打开`tipi_ini_demo.c``PHP_INI_BEGIN`宏和`PHP_INI_END`宏的注释。这里仅演示一个配置项
2044

2145
[c]

book/chapt11/11-04-01-ini-set.markdown

+22-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,34 @@
22

33
首先需要复习下[全局变量的使用](/book/?p=chapt11/11-03-00-global-var),这里就不重复说明了。
44
完整的代码可以参考[配合全局变量添加 INI Demo](https://github.com/reeze/tipi/tree/master/book/sample/chapt11/11-04-01-ini-set/)
5-
与上面的步骤中不同的地方仅仅是把 `PHP_INI_BEGIN` 宏和 `PHP_INI_END` 宏中申明 INI 变量的宏不一样
5+
与上面的步骤中不同的地方仅仅是把 `PHP_INI_BEGIN` 宏和 `PHP_INI_END` 宏中申明 INI 变量的宏不一样。
6+
7+
### STD_PHP_INI_ENTRY 宏
8+
9+
[c]
10+
/* main/php_ini.h */
11+
#define STD_PHP_INI_ENTRY STD_ZEND_INI_ENTRY
12+
/* Zend/zend_ini.h */
13+
STD_ZEND_INI_ENTRY(name, default_value, modifiable, on_modify, property_name, struct_type, struct_ptr)
14+
15+
参数 |描述
16+
--------------|------------------------------------------------
17+
name |ini 指令名
18+
default_value |默认值
19+
modifiable |ini 指令可以被修改的位域
20+
on_modify |修改 ini 指令的回调函数
21+
property_name |应当被更新的变量名
22+
struct_type |变量驻留的结构类型,通常使用全局变量。
23+
struct_ptr |全局变量结构体指针
24+
25+
### 声明
626

727
[c]
828
PHP_INI_BEGIN()
929
STD_PHP_INI_ENTRY("tipi_ini_demo.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_tipi_ini_demo_globals, tipi_ini_demo_globals)
1030
PHP_INI_END()
1131

12-
其他注册、注销,使用和前一小节一样,不过配合全局变量使用时,也通过全局变量宏来 INI 的值。
32+
其他注册、注销,使用和前一小节一样,不过配合全局变量使用时,也通过全局变量宏来读取 INI 的值。
1333

1434
[c]
1535
RETURN_LONG(TIPI_INI_DEMO_G(global_value));

book/chapt11/11-04-02-ini-set.markdown

+17-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ PHP7 中新定义了一个数据结构 `zend_ini_entry_def` 作为传入函数 `
4242

4343
### 声明变量
4444

45-
#### 使用 `PHP_INI_ENTRY`
45+
#### 使用 PHP_INI_ENTRY 宏
4646

4747
[c]
4848
PHP_INI_BEGIN()
@@ -60,7 +60,19 @@ PHP7 中新定义了一个数据结构 `zend_ini_entry_def` 作为传入函数 `
6060
PHP5 中则是 `zend_ini_entry` 结构体数组,注意有所变化。
6161
`PHP_INI_END()`是在 `ini_entries[]` 末尾添加了一个空的 `zend_ini_entry_def` 数组元素,这样方便在 `while` 循环读取 `ini_entries[]` 时通过获取下一个元素的 `name` 是否为 NULL 来判断是否结束循环,防止数组越界。
6262

63-
上面使用 `PHP_INI_ENTRY` 宏相当于声明了一个`zend_ini_entry_def`结构体,仅仅设置了名称、默认值和可以修改的时机这三个值。
63+
使用 `PHP_INI_ENTRY` 宏相当于声明了一个`zend_ini_entry_def`结构体,仅仅设置了名称、默认值和可以修改的时机这三个值。
64+
65+
#### 使用 STD_PHP_INI_ENTRY 宏
66+
67+
[c]
68+
PHP_INI_BEGIN()
69+
STD_PHP_INI_ENTRY("tipi_ini_demo.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_tipi_ini_demo_globals, tipi_ini_demo_globals)
70+
PHP_INI_END()
71+
72+
其参数的作用,在上一节已说明。
73+
其作用呢,实际是把 INI 指令值和全局变量指针 `tipi_ini_demo_globals` 关联起来,
74+
比如这里的 INI 指令 `tipi_ini_demo.global_value` 就与 `tipi_ini_demo_globals->global_value` 关联。
75+
当在更新该 INI 指令时,则根据 `ZEND_INI_MH(OnUpdateLong)` 来更新 `tipi_ini_demo_globals->global_value`
6476

6577
### 注册
6678

@@ -151,4 +163,6 @@ PHP5 中则是 `zend_ini_entry` 结构体数组,注意有所变化。
151163
}
152164

153165
因为前面注册的时候是以一个 `zend_ini_entry``name` 字段作为 `key` 存储的,所以这里也是根据传入的 `name`
154-
`EG(ini_directives)` 中查找。
166+
`EG(ini_directives)` 中查找。
167+
168+
销毁和注册类似,也不再做过多的阐述,重点还是自己跟一跟代码,手动敲一敲。这一节的分析就写到这里。

0 commit comments

Comments
 (0)