PHP 内幕:INI 宏之间的区别
PHP Internals: Difference Between INI Macros
我正在为 PHP 扩展开发 C 代码库。此扩展定义了几个 php.ini
设置。据我所知,有 两个 宏可以执行此操作。它们是 PHP_INI_ENTRY_EX
和 STD_PHP_INI_ENTRY_EX
。
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX (...)
STD_PHP_INI_ENTRY_EX (...)
PHP_INI_END()
使用一个宏与另一个宏创建 php.ini
设置之间的实际区别是什么?也就是说,我可以跟随白兔进入宏洞 see the final C that's generated,但我想知道的是 PHP 开发人员使用这些 ini
设置有哪些 behavior/functionality 差异等着瞧。
(以下是我对所有这些工作原理的最佳猜测——欢迎在评论中更正)
STD_PHP_INI_ENTRY
和 STD_PHP_INI_ENTRY_EX
宏允许 end-user-programmer 创建 ini 设置,其值保存在内存中(并且大概可以通过 [=13= 设置和获取) ]/ini_get
)。 PHP_INI_ENTRY
和 PHP_INI_ENTRY_EX
宏允许 end-user-programmer 创建一次触发回调函数的 ini 设置,然后在它们自己的 program/extension 中采取一些行动(即设置一些 global-ish 他们程序中的状态与 PHP 的 ini 系统无关。
_EX
版本的宏采用 extra 参数——这个额外参数是 PHP 将用于显示 ini 的回调phpinfo
等地方的价值。例如,您可以看到 the ldap.maxlinks
ini definition here with a display_link_numbers
callback. The source then defines the display_link_numbers
callback here.
STD_
宏旨在处理特定类型的状态 object/structs。再次使用上面的 ldap.maxlinks
示例,三个关键参数是 max_links
、zend_ldap_globals
和 ldap_globals
.
STD_PHP_INI_ENTRY_EX("ldap.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong,
max_links, zend_ldap_globals, ldap_globals,
display_link_numbers)
上面,zend_ldap_globals
参数是结构定义的名称,使用 ZEND_BEGIN_MODULE_GLOBALS
和 ZEND_END_MODULE_GLOBALS
宏设置。您可以看到宏调用 that create the zend_ldap_globals
definition here。上面的 max_links
参数是同一结构上的一个字段。
最后,ldap_globals
参数是该结构的一个实例,通过 PHP_GINIT_FUNCTION
宏创建。这个宏允许程序员设置一个 "per-php-request" 全局并且(我认为)是 PHP 将存储 ini 值的内存。你可以看到ldap per-request global setup here。
当你像上面那样设置一个结构来保持你的 ini 状态时,你可以使用一组预定义的 PHP 回调(上面的 OnUpdateLong
)来自动设置这些值PHP 用户通过 php.ini
设置一个值(或者可以设置 PHP ini
值的各个其他地方之一,具体取决于您使用的 PHP_INI
常量已传递给您的 STD_
宏(上面的 PHP_INI_SYSTEM
))。
我正在为 PHP 扩展开发 C 代码库。此扩展定义了几个 php.ini
设置。据我所知,有 两个 宏可以执行此操作。它们是 PHP_INI_ENTRY_EX
和 STD_PHP_INI_ENTRY_EX
。
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX (...)
STD_PHP_INI_ENTRY_EX (...)
PHP_INI_END()
使用一个宏与另一个宏创建 php.ini
设置之间的实际区别是什么?也就是说,我可以跟随白兔进入宏洞 see the final C that's generated,但我想知道的是 PHP 开发人员使用这些 ini
设置有哪些 behavior/functionality 差异等着瞧。
(以下是我对所有这些工作原理的最佳猜测——欢迎在评论中更正)
STD_PHP_INI_ENTRY
和 STD_PHP_INI_ENTRY_EX
宏允许 end-user-programmer 创建 ini 设置,其值保存在内存中(并且大概可以通过 [=13= 设置和获取) ]/ini_get
)。 PHP_INI_ENTRY
和 PHP_INI_ENTRY_EX
宏允许 end-user-programmer 创建一次触发回调函数的 ini 设置,然后在它们自己的 program/extension 中采取一些行动(即设置一些 global-ish 他们程序中的状态与 PHP 的 ini 系统无关。
_EX
版本的宏采用 extra 参数——这个额外参数是 PHP 将用于显示 ini 的回调phpinfo
等地方的价值。例如,您可以看到 the ldap.maxlinks
ini definition here with a display_link_numbers
callback. The source then defines the display_link_numbers
callback here.
STD_
宏旨在处理特定类型的状态 object/structs。再次使用上面的 ldap.maxlinks
示例,三个关键参数是 max_links
、zend_ldap_globals
和 ldap_globals
.
STD_PHP_INI_ENTRY_EX("ldap.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong,
max_links, zend_ldap_globals, ldap_globals,
display_link_numbers)
上面,zend_ldap_globals
参数是结构定义的名称,使用 ZEND_BEGIN_MODULE_GLOBALS
和 ZEND_END_MODULE_GLOBALS
宏设置。您可以看到宏调用 that create the zend_ldap_globals
definition here。上面的 max_links
参数是同一结构上的一个字段。
最后,ldap_globals
参数是该结构的一个实例,通过 PHP_GINIT_FUNCTION
宏创建。这个宏允许程序员设置一个 "per-php-request" 全局并且(我认为)是 PHP 将存储 ini 值的内存。你可以看到ldap per-request global setup here。
当你像上面那样设置一个结构来保持你的 ini 状态时,你可以使用一组预定义的 PHP 回调(上面的 OnUpdateLong
)来自动设置这些值PHP 用户通过 php.ini
设置一个值(或者可以设置 PHP ini
值的各个其他地方之一,具体取决于您使用的 PHP_INI
常量已传递给您的 STD_
宏(上面的 PHP_INI_SYSTEM
))。