關於php的ini文件相關操作函數淺析 https://www.php.net/manual/zh/configuration.changes.modes.php

在小公司,特別是創業型公司,整個服務器的搭建一般也是我們 PHP 開發工程師的職責之一。其中,最主要的一項就是要配置好服務器的 php.ini 文件。一些參數會對服務器的性能產生深遠的影響,而且也有些參數是可以在 PHP 運行時動態指定和獲取的。今天,我們就來學習一些和 php.ini 文件有關的操作函數。

動態設置ini文件的配置參數

這個函數相信大家不會陌生,基本上做過 PHP 開發的都會使用過。但是,有些參數是無法修改的,這個你知道嗎?

ini_set('allow_url_fopen', 0);
echo ini_get('allow_url_fopen'), PHP_EOL; // 1 ,無法修改,PHP_INI_SYSTEM

ini_set('memory_limit', -1);
echo ini_get('memory_limit'), PHP_EOL; // -1,可以修改,PHP_INI_ALL

請注意看註釋,第一條註釋中寫了 ,PHP_INI_SYSTEM ,並且這個參數無法修改。沒錯,相信聰明的你已經看出來了,這些參數是有對應的類型的。PHP_INI_SYSTEM 的意思就是隻能在 php.ini 或者 httpd.conf 中進行修改,無法在語言動態運行時修改。

不同的 php.ini 配置參數對應有四種類型:

  • PHP_INI_USER:可在用戶腳本(例如 ini_set())或 Windows 註冊表(自 PHP 5.3 起)以及 .user.ini 中設定
  • PHP_INI_PERDIR:可在 php.ini,.htaccess 或 httpd.conf 中設定
  • PHP_INI_SYSTEM:可在 php.ini 或 httpd.conf 中設定
  • PHP_INI_ALL:可在任何地方設定

也就是說,使用 ini_set() 我們可以設定類型爲 PHP_INI_USER 和 PHP_INI_ALL 類型的參數,而其它兩種只能在 php.ini 或其他配置文件中設置修改。具體的配置參數對應的類型請參考 PHP 相關文檔。

https://www.php.net/manual/zh/ini.list.php

獲取ini文件中的配置信息

當然,讀取 php.ini 文件中的配置信息就沒有什麼限制了。直接就可以讀取,我們可以使用兩個函數來進行讀取,它們是:get_cfg_var() 和 ini_get() 。另外,還有一個可以獲取數組集合形式的配置信息的函數 ini_get_all() 。我們一個一個來看。

get_cfg_var() 和 ini_get()

都是讀取單個配置參數信息。

echo get_cfg_var('error_reporting'), PHP_EOL; // 32759
echo ini_get('error_reporting'), PHP_EOL; // 32759

echo get_cfg_var('request_order'), PHP_EOL; // GP
echo ini_get('request_order'), PHP_EOL; // GP

// php.ini A=TEST_A
echo get_cfg_var('A'), PHP_EOL; // TEST_A
echo ini_get('A'), PHP_EOL; // 

上面兩條不用多解釋,我們需要注意到的是,最後一條。我們在 php.ini 文件中定義了一個自定義的配置參數 A 。可以看到,get_cfg_var() 可以正常獲取到這條信息,但 ini_get() 無法獲取。我們再看另外一個例子。

ini_set('error_reporting', E_WARNING);
echo get_cfg_var('error_reporting'), PHP_EOL; // 32759,只返回.ini的內容
echo ini_get('error_reporting'), PHP_EOL; // 2,返回當前配置運行時的狀態

使用 ini_set() 動態設置了 error_reporting 參數後,get_cfg_var() 返回是 ini_set() 設置的值,而 ini_get() 獲取的依然是 php.ini 文件裏面配置的值。

從上面兩個例子可以看出這兩個函數的區別:

  • get_cfg_var(),可以獲取自定義的配置參數值,但只以 php.ini 文件爲準,無法獲得動態修改的參數值
  • ini_get(),無法獲取自定義的配置參數值,以當前的動態腳本運行時的配置爲準,也就是能夠獲取到 ini_set() 修改後的參數值

ini_get_all()

它獲取的是一組數據,比如我們安裝的一些擴展 Swoole 、 xDebug 或者 mysqlnd 這類的配置信息。

print_r(ini_get_all('swoole'));
echo PHP_EOL;
// Array
// (
//     [swoole.display_errors] => Array
//         (
//             [global_value] => On
//             [local_value] => On
//             [access] => 7
//         )

//     [swoole.enable_coroutine] => Array
//         (
//             [global_value] => On
//             [local_value] => On
//             [access] => 7
//         )

//     [swoole.enable_library] => Array
//         (
//             [global_value] => On
//             [local_value] => On
//             [access] => 7
//         )

//     [swoole.enable_preemptive_scheduler] => Array
//         (
//             [global_value] => Off
//             [local_value] => Off
//             [access] => 7
//         )

//     [swoole.unixsock_buffer_size] => Array
//         (
//             [global_value] => 262144
//             [local_value] => 262144
//             [access] => 7
//         )

//     [swoole.use_shortname] => Array
//         (
//             [global_value] => 
//             [local_value] => 
//             [access] => 4
//         )

// )

可以看出,我們針對 Swoole 所作的所有配置信息都以數組形式返回了。

還原配置信息

當我們使用了 ini_set() 動態設置了參數信息後,想還原爲 php.ini 文件中的默認配置的話,直接使用一個 ini_restore() 函數就可以了。

ini_restore('error_reporting');
echo ini_get('error_reporting'), PHP_EOL; // 32759

依然是沿用上面的代碼, error_reporting 已經被我們修改爲了 2 ,這時,我們直接使用 ini_restore() 進行了還原,再使用 ini_get() 就可以看到 error_reporting 參數還原回了 php.ini 文件中定義的原始值。

獲取當前加載的配置文件路徑

當你接手一臺服務器的時候,往往第一步就是找到它的相關應用配置文件,比如 mysql 的 my.ini 或者 nginx 的 conf 相關配置文件路徑,而 PHP 中我們第一步就是要找到 php.ini 文件在哪裏。

echo php_ini_loaded_file(), PHP_EOL;
// /usr/local/etc/php/7.3/php.ini

echo php_ini_scanned_files(), PHP_EOL;

我們直接使用 php_ini_loaded_file() 就可以方便的獲取到當前運行的腳本環境中加載的 php.ini 文件的路徑。而 php_ini_scanned_files() 函數則是會以逗號分隔的形式返回所有可以掃描 php.ini 文件的路徑。其實這兩個參數在 phpinfo() 中都都有所體現,但很多時候我們並不能直接在生產環境中去使用 phpinfo() 。

其實,相對於這兩個函數或 phpinfo() 來說,更好的方案是直接在命令行查找 php.ini 文件的位置。

php --ini
# Configuration File (php.ini) Path: /usr/local/etc/php/7.3
# Loaded Configuration File:         /usr/local/etc/php/7.3/php.ini
# Scan for additional .ini files in: /usr/local/etc/php/7.3/conf.d
# Additional .ini files parsed:      /usr/local/etc/php/7.3/conf.d/ext-opcache.ini

php -i | grep "Configuration"
# Configuration File (php.ini) Path => /usr/local/etc/php/7.3
# Loaded Configuration File => /usr/local/etc/php/7.3/php.ini
# Configuration

phpinfo()

關於 phpinfo() ,我們不用解釋太多,裏面的內容都有什麼應該是學習使用 PHP 的開發人員的必修課。在這裏,我們只是介紹一下 phpinfo() 這個函數的參數。沒錯,它是有參數的,可以只顯示一部分的信息而不是全部都顯示出來。

  • INFO_GENERAL:配置的命令行、 php.ini 的文件位置、建立的時間、Web 服務器、系統及更多其他信息。
  • INFO_CREDITS:PHP 貢獻者名單。參加 phpcredits()。
  • INFO_CONFIGURATION:當前PHP指令的本地值和主值。參見 ini_get()。
  • INFO_MODULES:已加載的模塊和模塊相應的設置。參見 get_loaded_extensions()。
  • INFO_ENVIRONMENT:環境變量信息也可以用 $_ENV 獲取。
  • INFO_VARIABLES:顯示所有來自 EGPCS (Environment, GET, POST, Cookie, Server) 的 預定義變量。
  • INFO_LICENSE:PHP許可證信息。參見 » license FAQ。
  • INFO_ALL:顯示以上所有信息。
phpinfo(INFO_MODULES);

上面的代碼在頁面中所顯示的信息就只是已加載模式相關的配置信息了。phpinfo() 會直接輸出到頁面上,如果想將它的內容保存在一個變量中,我們需要使用輸出緩衝控制來進行操作。我們將在後面的文章中講到這方面的內容。這裏就簡單的給一段代碼。

ob_start();
phpinfo();
$v = ob_get_contents();
ob_end_clean();

echo $v;

總結

不看不知道,一看嚇一跳。原來只是使用過 ini_set() 去修改運行時內存大小,但直到今天才知道原來 ini_set() 並不是所有的配置都可以修改的,每個參數是否能動態修改還要看它的參數類型。而且上面還忘了說了,我們並不能使用 ini_set() 去增加配置參數。也就是說,使用 ini_set("B", "TEST_B") 增加一個 B 參數,然後直接使用 ini_get() 也是無法獲取的。而且簡單的獲取參數信息的兩個函數也有這麼多的不同,phpinfo() 原來也有這麼多參數。果然,文檔纔是最好的學習資料。旅程還沒有停止,我們刷文檔的腳步依然不能停,一起加油沖沖衝!!

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E5%85%B3%E4%BA%8Ephp%E7%9A%84ini%E6%96%87%E4%BB%B6%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E6%B5%85%E6%9E%90.php

參考文檔:

https://www.php.net/manual/zh/function.get-cfg-var.php

https://www.php.net/manual/zh/function.ini-set.php

https://www.php.net/manual/zh/function.ini-restore.php

https://www.php.net/manual/zh/function.ini-get.php

https://www.php.net/manual/zh/function.ini-get-all.php

https://www.php.net/manual/zh/function.ini-alter.php

https://www.php.net/manual/zh/function.php-ini-loaded-file.php

https://www.php.net/manual/zh/function.php-ini-scanned-files.php

https://www.php.net/manual/zh/ini.list.php

https://www.php.net/manual/zh/configuration.changes.modes.php

各自媒體平臺均可搜索【硬核項目經理】

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