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

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