php中ini配置原理的详细说明
每个使用php的人都知道,php.ini配置的实现将贯穿SAPI的整个生命周期。在php脚本的执行过程中,如果ini配置被手动修改,它将不起作用。此时,如果无法重新启动apache或nginx,只能在php代码中显式调用ini_set接口。Ini_set是php提供的一个函数,用于动态修改配置。需要注意的是,ini_set设置的配置有效时间范围与ini文件中设置的不同。php脚本执行后,ini_set的设置将无效。
因此,本文将分为两部分,第一部分阐述php.ini的配置原理,第二部分讲述动态修改php配置。
php.ini的配置大致涉及三条数据,如configuration_hash、EG(ini _ instructions)、PG、BG、PCRE_G、JSON_G、XXX_G等。如果你不知道这三种数据的含义也没关系,下面会详细解释。
1.解析INI配置文件
由于php.ini需要在SAPI期间一直生效,解析ini文件并基于它构建php配置的工作必须从SAPI开始。换句话说,它必须发生在php启动期间。Php需要在任何实际请求到达之前在内部生成这些配置。
反映到php内核的函数是php_module_startup。
Php_module_startup主要负责启动Php,通常在SAPI启动时调用。另外一个常见的函数是php_request_startup,它负责初始化每个请求。php_module_startup和php_request_startup是两个标记动作,但分析它们超出了本文的范围。
例如,当php在apache下挂接制作一个模块时,所有这些模块都会在apache启动时被激活,包括php模块。一旦激活php模块,就会调用php_module_startup。php_module_startup函数已经做了大量的工作。一旦php_module_startup调用结束,就意味着OK,php已经启动,现在可以接受请求和响应了。
在php_module_startup函数中,与解析ini文件相关的实现是:
复制的代码如下:/*这将在php.ini中读取,设置配置参数,加载zend扩展并注册稍后加载的php函数扩展*/if(PHP _ init _ config(TSRMLS _ C)=FAILURE){ return FAILURE;}
您可以看到php_init_config函数实际上是被调用来解析ini文件的。Parse主要进行lexgrammar分析,提取并保存ini文件中键和值的键值对。php.ini的格式很简单,左边是key,右边是value。每当提取一对KVs时,php将它们存储在哪里?答案是前面提到的configuration_hash。
静态HashTable配置_ hashConfiguration_hash是用php_ini.c声明的,它是一个HashTable数据结构。顾名思义,它实际上是一个哈希表。此外,在php5.3之前,您无法获得configuration_hash,因为它是php_ini.c文件中的静态变量。后来php5.3增加了php_ini_get_configuration_hash接口,直接返回configuration_hash,这样php扩展就可以方便地看到configuration_hash的全貌.
注意四点:
首先,除了词法语法,php_init_config不会做任何验证。也就是说,如果我们在ini文件中添加一行hello=world,只要是格式正确的配置项,最终的configuration_hash将包含一个带有key hello和值world的元素,configuration_hash将最大程度地反映ini文件。
其次,ini文件允许我们以数组的形式配置它。例如,在ini文件中写下以下三行:
复制代码如下: drive . arr[]=1 drive . arr[]=2 drive . arr[]=3
然后在最终生成的configuration_hash表中,只
版权声明:php中ini配置原理的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。