PHP 内幕:INI 宏之间的区别

PHP Internals: Difference Between INI Macros

我正在为 PHP 扩展开发 C 代码库。此扩展定义了几个 php.ini 设置。据我所知,有 两个 宏可以执行此操作。它们是 PHP_INI_ENTRY_EXSTD_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_ENTRYSTD_PHP_INI_ENTRY_EX 宏允许 end-user-programmer 创建 ini 设置,其值保存在内存中(并且大概可以通过 [=13= 设置和获取) ]/ini_get)。 PHP_INI_ENTRYPHP_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_linkszend_ldap_globalsldap_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_GLOBALSZEND_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))。