| 關(guān)于php的ini文件相關(guān)操作函數(shù)淺析在小公司,特別是創(chuàng)業(yè)型公司,整個服務(wù)器的搭建一般也是我們 PHP 開發(fā)工程師的職責之一。其中,最主要的一項就是要配置好服務(wù)器的 php.ini 文件。一些參數(shù)會對服務(wù)器的性能產(chǎn)生深遠的影響,而且也有些參數(shù)是可以在 PHP 運行時動態(tài)指定和獲取的。今天,我們就來學(xué)習一些和 php.ini 文件有關(guān)的操作函數(shù)。 動態(tài)設(shè)置ini文件的配置參數(shù)這個函數(shù)相信大家不會陌生,基本上做過 PHP 開發(fā)的都會使用過。但是,有些參數(shù)是無法修改的,這個你知道嗎? ini_set('allow_url_fopen', 0);請注意看注釋,第一條注釋中寫了 ,PHP_INI_SYSTEM ,并且這個參數(shù)無法修改。沒錯,相信聰明的你已經(jīng)看出來了,這些參數(shù)是有對應(yīng)的類型的。PHP_INI_SYSTEM 的意思就是只能在 php.ini 或者 httpd.conf 中進行修改,無法在語言動態(tài)運行時修改。 不同的 php.ini 配置參數(shù)對應(yīng)有四種類型: 
 也就是說,使用 ini_set() 我們可以設(shè)定類型為 PHP_INI_USER 和 PHP_INI_ALL 類型的參數(shù),而其它兩種只能在 php.ini 或其他配置文件中設(shè)置修改。具體的配置參數(shù)對應(yīng)的類型請參考 PHP 相關(guān)文檔。 https://www./manual/zh/ini.list.php 獲取ini文件中的配置信息當然,讀取 php.ini 文件中的配置信息就沒有什么限制了。直接就可以讀取,我們可以使用兩個函數(shù)來進行讀取,它們是:get_cfg_var() 和 ini_get() 。另外,還有一個可以獲取數(shù)組集合形式的配置信息的函數(shù) ini_get_all() 。我們一個一個來看。 get_cfg_var() 和 ini_get()都是讀取單個配置參數(shù)信息。 echo get_cfg_var('error_reporting'), PHP_EOL; // 32759上面兩條不用多解釋,我們需要注意到的是,最后一條。我們在 php.ini 文件中定義了一個自定義的配置參數(shù) A 。可以看到,get_cfg_var() 可以正常獲取到這條信息,但 ini_get() 無法獲取。我們再看另外一個例子。 ini_set('error_reporting', E_WARNING);使用 ini_set() 動態(tài)設(shè)置了 error_reporting 參數(shù)后,get_cfg_var() 返回是 ini_set() 設(shè)置的值,而 ini_get() 獲取的依然是 php.ini 文件里面配置的值。 從上面兩個例子可以看出這兩個函數(shù)的區(qū)別: 
 ini_get_all()它獲取的是一組數(shù)據(jù),比如我們安裝的一些擴展 Swoole 、 xDebug 或者 mysqlnd 這類的配置信息。 print_r(ini_get_all('swoole'));可以看出,我們針對 Swoole 所作的所有配置信息都以數(shù)組形式返回了。 還原配置信息當我們使用了 ini_set() 動態(tài)設(shè)置了參數(shù)信息后,想還原為 php.ini 文件中的默認配置的話,直接使用一個 ini_restore() 函數(shù)就可以了。 ini_restore('error_reporting');依然是沿用上面的代碼, error_reporting 已經(jīng)被我們修改為了 2 ,這時,我們直接使用 ini_restore() 進行了還原,再使用 ini_get() 就可以看到 error_reporting 參數(shù)還原回了 php.ini 文件中定義的原始值。 獲取當前加載的配置文件路徑當你接手一臺服務(wù)器的時候,往往第一步就是找到它的相關(guān)應(yīng)用配置文件,比如 mysql 的 my.ini 或者 nginx 的 conf 相關(guān)配置文件路徑,而 PHP 中我們第一步就是要找到 php.ini 文件在哪里。 echo php_ini_loaded_file(), PHP_EOL;我們直接使用 php_ini_loaded_file() 就可以方便的獲取到當前運行的腳本環(huán)境中加載的 php.ini 文件的路徑。而 php_ini_scanned_files() 函數(shù)則是會以逗號分隔的形式返回所有可以掃描 php.ini 文件的路徑。其實這兩個參數(shù)在 phpinfo() 中都都有所體現(xiàn),但很多時候我們并不能直接在生產(chǎn)環(huán)境中去使用 phpinfo() 。 其實,相對于這兩個函數(shù)或 phpinfo() 來說,更好的方案是直接在命令行查找 php.ini 文件的位置。 php --iniphpinfo()關(guān)于 phpinfo() ,我們不用解釋太多,里面的內(nèi)容都有什么應(yīng)該是學(xué)習使用 PHP 的開發(fā)人員的必修課。在這里,我們只是介紹一下 phpinfo() 這個函數(shù)的參數(shù)。沒錯,它是有參數(shù)的,可以只顯示一部分的信息而不是全部都顯示出來。 
 phpinfo(INFO_MODULES);上面的代碼在頁面中所顯示的信息就只是已加載模式相關(guān)的配置信息了。phpinfo() 會直接輸出到頁面上,如果想將它的內(nèi)容保存在一個變量中,我們需要使用輸出緩沖控制來進行操作。我們將在后面的文章中講到這方面的內(nèi)容。這里就簡單的給一段代碼。 ob_start();總結(jié)不看不知道,一看嚇一跳。原來只是使用過 ini_set() 去修改運行時內(nèi)存大小,但直到今天才知道原來 ini_set() 并不是所有的配置都可以修改的,每個參數(shù)是否能動態(tài)修改還要看它的參數(shù)類型。而且上面還忘了說了,我們并不能使用 ini_set() 去增加配置參數(shù)。也就是說,使用 ini_set("B", "TEST_B") 增加一個 B 參數(shù),然后直接使用 ini_get() 也是無法獲取的。而且簡單的獲取參數(shù)信息的兩個函數(shù)也有這么多的不同,phpinfo() 原來也有這么多參數(shù)。果然,文檔才是最好的學(xué)習資料。旅程還沒有停止,我們刷文檔的腳步依然不能停,一起加油沖沖沖?。?/p> 測試代碼: 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./manual/zh/function.get-cfg-var.php https://www./manual/zh/function.ini-set.php https://www./manual/zh/function.ini-restore.php https://www./manual/zh/function.ini-get.php https://www./manual/zh/function.ini-get-all.php https://www./manual/zh/function.ini-alter.php https://www./manual/zh/function.php-ini-loaded-file.php https://www./manual/zh/function.php-ini-scanned-files.php https://www./manual/zh/ini.list.php https://www./manual/zh/configuration.changes.modes.php | 
|  | 
來自: 硬核項目經(jīng)理 > 《待分類》