【问题标题】:PHP Internals: Difference Between INI MacrosPHP 内部结构:INI 宏之间的区别
【发布时间】:2018-07-24 03:46:55
【问题描述】:

我正在为 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,但我想知道的是使用这些ini 设置的PHP 开发人员会看到什么样的排序行为/功能差异。

【问题讨论】:

  • 不确定这是否有帮助,但我认为使用的两个是 STD_PHP_INI_ENTRYPHP_INI_ENTRY docstore.mik.ua/orelly/webprog/php/ch14_12.htm
  • 谢谢@AbraCadaver——这并不能直接回答我的问题,但该链接上有很多好的/有用的信息!

标签: php macros php-internals


【解决方案1】:

(以下是我对这一切如何运作的最佳猜测——欢迎在 cmets 中更正)

STD_PHP_INI_ENTRYSTD_PHP_INI_ENTRY_EX 宏允许最终用户程序员创建 ini 设置,其值保存在内存中(并且可以通过ini_set/ini_get 进行设置和获取)。 PHP_INI_ENTRYPHP_INI_ENTRY_EX 宏允许最终用户程序员创建触发回调函数一次的 ini 设置,然后在他们自己的程序/扩展中采取一些行动(即在他们的程序中设置一些全局状态而不是与PHP的ini系统相关)。

_EX 版本的宏带有一个 extra 参数——这个额外的参数是 PHP 将用来在 phpinfo 等位置显示 ini 值的回调。例如,您可以看到the ldap.maxlinks ini definition here with a display_link_numbers 回调。然后源defines the display_link_numbers callback here

STD_ 宏设计用于处理特定类型的状态对象/结构。再次使用上面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 用户通过 @ 设置值时自动设置这些值987654350@ (或可以设置 PHP ini 值的其他各种地方之一,具体取决于您传递给 STD_ 宏(上面的PHP_INI_SYSTEM)的 PHP_INI 常量)。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2016-09-23
    相关资源
    最近更新 更多