php中ini配置的原理是什么

介绍

今天就跟大家聊聊有关php中ini配置的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

. ini的配置大致会涉及到三块数据,configuration_hash,如(ini_directives)以及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开始的时候被调用.btw,还有一个常见的函数是php_request_startup,它负责将在每个请求到来的时刻进行初始化,php_module_startup与php_request_startup是两个标识性的动作,不过对他们进行分析并不在本文的探讨范围内。

举个例子,当php挂接在apache下面做一个模块,那么apache启动的时候,便会激活所有这些模块,其中包括php模块。在激活php模块时,便会调用到php_module_startup.php_module_startup函数完成了茫茫多的工作,一旦php_module_startup调用结束就意味着,好吧,php已经启动,现在可以接受请求并作出响应了。

在php_module_startup函数中,与解析ini文件相关的实现是:

代码如下:


/*这将用php读取。ini设置配置参数,
,,加载zend php扩展和注册功能扩展
,,加载后*/
如果(php_init_config (TSRMLS_C)==失败){
,,,返回失败;
}

可以看的到,其实就是调用了php_init_config函数,去完成对ini文件的parse.parse工作主要进行lex&语法分析,并将ini文件中的键,值键值对提取出来并保存。php。ini的格式很简单,等号左侧为关键,右侧为价值。每当一对kv被提取出来之后,php将它们存储到哪儿呢?答案就是之前提到的configuration_hash。

静态HashTable configuration_hash;
configuration_hash声明在php_ini.c中,它是一个散列表类型的数据结构,顾名思义,其实就是张哈希表。题外话,在php5.3之前的版本是没法获取configuration_hash的,因为它是php_ini.c文件的一个静态的变量。后来php5.3添加了php_ini_get_configuration_hash接口,该接口直接返回,configuration_hash,使得php各个扩展可以方便的一窥configuration_hash全貌…真是普大喜奔……

注意四点:

第一,php_init_config不会做除了词法语法以外的任何校验。也就是说,假如我们在ini文件中添加一行你好=世界,只要这是一个格式正确的配置项,那么最终configuration_hash中就会包含一个键为你好,值为世界的元素,configuration_hash最大限度的反映出ini文件。

第二,ini文件允许我们以数组的形式进行配置,例如ini文件中写入以下三行:

代码如下:


drift.arr []=1
drift.arr []=2
drift.arr []=3

那么最终生成的configuration_hash表中,就会存在一个键为drift.arr的元素,其值为一个包含的1、2、3三个数字的数组。这是一种极为罕见的配置方法。

第三,php还允许我们除了默认的php . ini文件(准确说是php - % s.ini)之外,另外构建一些ini文件。这些ini文件会被放入一个额外的目录。该目录由环境变量PHP_INI_SCAN_DIR来指定,当php_init_config解析完了php . ini中之后,会再次扫描此目录,然后找出目录中所有. ini文件来分析。这些额外的ini文件中产生的kv键值对,也会被加入到configuration_hash中去。

这是一个偶尔有用的特性,假设我们自己开发php的扩展,却又不想将配置混入php。ini,便可以另外写一份ini,并通过PHP_INI_SCAN_DIR告诉php该去哪儿找到它。当然,其缺点也显而易见,其需要设置额外的环境变量来支持。更好的解决办法是,开发者在扩展中自己调用php_parse_user_ini_file或zend_parse_ini_file去解析对应的ini文件。

第四,在configuration_hash中,关键是字符串,那么值的类型是什么?答案也是字符串(除了上述很特殊的数组)。具体来说,比如下面的配置:

代码如下:


display_errors=alt=" php中ini配置的原理是什么">

再例如json模块,也是php中一个很常用的模块:

代码如下:


ZEND_BEGIN_MODULE_GLOBALS (json)
,,,int error_code;
ZEND_END_MODULE_GLOBALS (json)

可以看到json模块并不需要ini配置,它的全局空间只有一个字段error_code.error_code记录了上一次执行json_decode或者json_encode中发生的错误.json_last_error函数便是返回这个error_code,来帮助用户定位错误原因。

php中ini配置的原理是什么