我曾在某些系統上遇到當嘗試設定在每個主機設定中 php.ini 內設定的設定時,ini_set() 會失敗並傳回 false 的情況。請注意這一點。
(PHP 4, PHP 5, PHP 7, PHP 8)
ini_set — 設定組態選項的值
設定給定組態選項的值。該組態選項將在指令碼執行期間保留這個新值,並在指令碼結束時還原。
成功時傳回舊值,失敗時傳回 false
。
範例 #1 設定 ini 選項
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
echo ini_get('display_errors');
?>
[[[編輯註記:是的,這是真的。同樣適用於
register_globals、magic_quotes_gpc 和其他。
]]]
許多設定雖然確實被設定,但在你的指令碼中沒有影響.... 像是 upload_max_filesize 會被設定,但上傳的檔案已經在設定變更之前傳遞到你的 PHP 指令碼。
此外,由 ini_set() 設定的其他設定可能因為這個原因而太晚(post_max_size 等)。
請注意,請嘗試透過 php.ini 或 .htaccess 進行設定。
在檢查 ini_set() 是否成功時,請記住它在成功時會傳回舊的值 - 這可能是「0」。因此,你不能只比較傳回值 - 你必須檢查「身分」
<?php
// 這不會判斷 ini_set() 是否成功,而是
// 它只測試舊值是否等同於 false
if ( !ini_set( 'display_errors', '1' ) )
throw new \Exception( '無法設定 display_errors。' );
// 這是判斷是否成功的正確方法
if ( ini_set( 'display_errors', '1' ) === false )
throw new \Exception( '無法設定 display_errors。' );
?>
這解釋了 ini_set()「總是」似乎會失敗的回報情況!
請小心設定 output_handler,因為你無法使用 ini_set() 來變更它。*嘆氣*
在我的 php.ini 中,我的網頁有這個(而且我想要它)
output_handler = ob_gzhandler
但這會導致我的命令列指令碼直到最後才會顯示輸出。
#!/usr/bin/php -q
<?php
ini_set('output_handler', 'mb_output_handler');
echo "\noutput_handler => " . ini_get('output_handler') . "\n";
?>
root@# ./myscript.php
output_handler => ob_gzhandler
顯然(根據 Richard Lynch 的說法)
> 太晚了!
> ob_start() 在此時已經啟動。
> ob_flush() 直到沒有更多的緩衝區。
如果它不是你的伺服器,因此你想向其他使用者隱藏你的 session 變數中的資料,在你的指令碼中使用共用記憶體設定 session.save_handler 非常有用
<?php ini_set('session.save_handler','mm'); ?>
請記住:你必須在每個使用 session 變數的指令碼中,在 "session_start()" 之前設定它,否則 PHP 將找不到它們。
使用 'php_flag' 在 .htaccess 檔案中設定 PHP_INI_PERDIR 設定,如下所示
php_flag register_globals off
php_flag magic_quotes_gpc on
當你的 ISP 不允許你新增預設的 include 目錄時,擴充 'include_path' 變數可能會很有用
<?php ini_set('include_path',ini_get('include_path').':../includes:'); ?>
請注意 - 在某些情況下,當透過 ini_set 將 zlib.output_compression 設定為 "On" 時,PHP 不會發送 Content-type 標頭,導致瀏覽器輸出亂碼。請改為將其設定為所需的緩衝區大小,這樣會發送正確的標頭。
<?php
ini_set("zlib.output_compression", 4096);
?>
若要更改 zend.assertions 或 assert.exception 的值,請嘗試使用 ini_set() 函數,但請注意它可能無法成功。
範例
<?php
$ret = @ini_set('zend.assertions', '1');
if ($ret === false) echo 'ini_set() 在第 ', __LINE__, PHP_EOL, ' 行之前失敗';
雖然這不應該放在手冊中,但對於在這個頁面尋找 zend_optimizer.* ini 選項的人來說,應該會很有用,因為它們通常會被安裝。
"zend_optimizer.optimization_level" 和 "zend_optimizer.enable_loader" 選項的資訊可在以下網址找到:
http://www.zend.com/support/user_docs/ZendOptimizer/PDF/ZendOptimizer_UserGuide.pdf
[[[編輯註記:僅僅因為你可以設定某個東西
並不代表它會如預期般運作。這取決於
設定。例如,在執行時設定 register_globals
幾乎沒有用,因為它的工作在你的腳本執行到
那裡時就已經完成了。
]]]
當設定無法在使用者腳本中更改時,ini_set 的回傳值是 "empty",而不是你可能預期的 "false"。
如果你在你的腳本中檢查回傳值是否為 "false",腳本將會繼續處理,即使設定沒有被設定。
布林回傳值用於可以在腳本中更改的設定。否則,將回傳空值。
要測試兩種錯誤情況,請使用
<?php
if (empty($blnResult) or (!$blnResult)) {
echo "設定無法被設定";
exit;
}
?>
如果你收到一個錯誤訊息,像是
超過 30 秒的最大執行時間
如果你設定 ini_set(max_execution_time, 300);
你的問題將會被解決
請注意,300 代表 300 秒,也就是 5 分鐘,你可以設定其他值!