lamp架构下php运行时配置分析(php_info()函数返回值之local value 与master value区别)

lamp架构下php运行时配置分析(php_info()函数返回值之local value 与master value区别)

通过不同的SAPI接口来执行php代码,php_info()打印的配置参数值可能不同:

       我们用linux命令php执行php_info()函数,与使用浏览器访问网页执行该函数,返回结果可能是不同的。为何呢,因为实际输出的当前有效配置是与运行环境有关的,比如在命令行执行php -r ./info.php文件,那么环境就是php.ini的全局配置+info.php本身可能通过ini_set函数修改过配置等。如果用lamp架构的网页执行,那么php的配置除了被php文件本身的ini_set函数修改外,还可能被httpd.conf,.htaccess文件中php_value命令来修改php.ini中的配置,因此不同的执行php程序的客户端,那么输出的运行时配置php_info()的配置值可能是不同的,这里的运行时配置值指的是php_info()中的local value值。一般情况不同的客户端,其master value也可能不一样,一般情况下master value加载的是php.ini配置,但是如果与php-fpm作为SAPI来接入php引擎,那么php.ini中的配置可能会被php-fpm中的配置覆盖(如果php-fpm中也定义了与php.ini中配置相同的配置选项参数),此时master value和local value都会被重写。如果是apache的httpd.conf和.htaccess的php_value来重写php.ini或php-fpm中的参数,那么仅仅重写local value,不会重写master value。
       有一点需要注意:如果lamp架构,如果通过代理用php-fpm来执行php程序,那么php-fpm的配置文件会覆盖掉php.ini部分相同配置,如error.log的配置值,会采用php-fpm中的来实际有效。在浏览器访问lamp的php_info函数的时候local value和master value的值都显示为php-fpm中配置的值。如经过实际测试php.ini中的error_log = /var/php_errors.log 会被覆盖。

master is either the value compiled into PHP, or set via a main php.ini directive. e.g. The value that’s in effect when PHP fires up(启动时), before it executes any of your code.
local is the value that’s currently in effect at the moment you call phpinfo(). This local value is the END result of any overrides that have taken place via ini_set() calls, php_value directives in httpd.conf/.htaccess, etc…
e.g.(此本地值是通过ini_set()调用、httpd.conf/.htaccess中的php_value指令等进行的任何重写的最终结果。)

下面是各种php参数重写的优先级,越向下优先级越高:

@php.ini: foo=bar ---------如果配置,那么初始化local value和master value的值。
@php-fpm php_value[foo]=barfpm ----------(如果配置,那么会同时改变local value和master value的值(无论用php_value/php_flag php_admin_value/php_admin_flag 配置,都会同时改变local和master),注意强商科技:如果php-fpm配置了与php.ini中配置相冲突的配置,那么php-fpm会覆盖掉php.ini中的配置,如php的错误日志,一般php-fpm使用的fcgi的SAPI,该SAPI模式下,
apache的php_value命令是无效的(如果使用,那么可能会报错启动apache失败,加入<IfModule mod_php5.c>标签来避免报错,但是仍然对SAPI为php-fpm的php配置无效。apache的httpd.conf中的php_value指令仅仅对mod_php的SAPI有效),如果在这里配置了与php.ini冲突的参数,那么会覆盖php.ini中的参数,且lamp架构下浏览器访问php文件的php_info的时候,php-fpm中配置的php参数和值会同时显示到local value和master value,除非有更高优先级的配置出现,
如在php页面中有<?php ini_set('memory_limit','200M'); phpinfo();?>那么memory_limit的local value 为200M,master value 为php-fpm的值(前提是php-fpm配置了该值,如果没有配置,那么master value为php.ini中的值)php-fpm配置中使用 php_value/php_flag配置php参数,you can set classic ini defines which can be overwritten from PHP call ‘ini_set’. 如果使用php_admin_value/php_admin_flag进行配置,那么these directives won’t be overwritten by PHP call ‘ini_set’)
@httpd.conf: php_value foo baz----------如果配置,那么会改变local value的值,不改变master value的值【强商科技,已验证】
@.htaccess: php_value foo qux-----------如果配置,那么会改变local value的值,不改变master value的值【强商科技,已验证】
@ini_set: ini_set(‘foo’, ‘kittens’);----------------如果配置,那么会改变local value的值,不改变master value的值【该函数运行时的local value值,会覆盖php.ini,apache的php_value,php-fpm的php_value[],不会覆盖php-fpm的php_admin_value[]】

Given that, the master value is ’ barfpm’ and the local value is’kittens’.

Setting a PHP config value in httpd.conf, .htaccess or .user.ini, etc. does not change the reported “master value”, only the “local value” is changed.
hosted website will check local values in .htaccess or .user.ini first (These files are in your local website folder also can say local level configuration files).
Local values overrides Master values, so php will check the local values first.[强商科技:运行环境以local value为实际参数有效值]
找到php.ini的位置:

php -i | grep 'Configuration File'
or
php -i | grep php.ini

so even if we set master values in php.ini or php-fpm(如果设置php-fpm,当php-fpm作为SAPI运行php代码时候,那么php-fpm会覆盖php.ini), we also need to check local values .htaccess or .user.ini

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章