在小公司,特別是新創公司,整個伺服器的搭建一般也是我們PHP開發工程師的職責之一。其中,最主要的一項就是要設定好伺服器的php.ini檔案。有些參數會對伺服器的效能產生深遠的影響,而且有些參數是可以在PHP運作時動態指定和取得的。今天,我們就來學習一些和php.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
當然,讀取php. ini 檔案中的設定資訊就沒有什麼限制了。直接就可以讀取,我們可以使用兩個函數來進行讀取,它們是:get_cfg_var() 和 ini_get() 。另外,還有一個可以取得數組集合形式的配置資訊的函數 ini_get_all() 。我們一個接一個來看。
都是讀取單一組態參數資訊。
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() 修改後的參數值
它取得的是一組數據,像是我們安裝的一些擴充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() ,我們不用解釋太多,裡面的內容都有什麼應該是學習使用 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
推荐学习:php视频教程
以上是詳細介紹關於php的ini檔案相關操作函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!