PHP 配置指令的修改範圍決定了在哪裡、如何修改生效。理解 PHP_INI_SYSTEM、PHP_INI_ALL、PHP_INI_PERDIR、PHP_INI_USER 四種模式,避免「改了配置不生效」的低級錯誤。
| 範圍常量 | 可修改位置 | ini_set() | 典型指令示例 | 生效時機 |
|---|---|---|---|---|
| PHP_INI_SYSTEM | php.ini、httpd.conf | ❌ 不可 | memory_limit、max_execution_time、upload_max_filesize、post_max_size | PHP 重啟(CLI 即時、Web 需重啟 PHP-FPM/Apache) |
| PHP_INI_PERDIR | php.ini、httpd.conf、.htaccess | ❌ 不可 | open_basedir、disable_functions、error_reporting、display_errors | Web 重啟/Apache 重載 |
| PHP_INI_USER | php.ini、.user.ini、.htaccess | ✅ 可 | include_path、max_input_vars、session.save_path | 即時(.user.ini 需緩存過期) |
| PHP_INI_ALL | 所有位置 | ✅ 可 | date.timezone、default_charset、precision、serialize_precision | 即時 |
open_basedir 限制訪問目錄、disable_functions 禁用危險函數.user.ini,類似 .htaccess 但針對 PHP-FPM.user.ini 覆蓋配置user_ini.cache_ttl(默認 300 秒)控制生效延遲date.timezone、error_reporting 等<?php
// 錯誤:memory_limit 是 PHP_INI_SYSTEM
ini_set('memory_limit', '512M'); // 無效!
// 正確:修改 php.ini
// memory_limit = 512M
// 重啟 PHP-FPM
?>
<?php
// 錯誤:PHP_INI_SYSTEM
ini_set('upload_max_filesize', '100M'); // 無效!
// 正確:php.ini 修改雙項
// upload_max_filesize = 100M
// post_max_size = 120M // 必須大於 upload_max_filesize
?>
# 錯誤:Nginx 不支援 .htaccess # .htaccess 中 php_value open_basedir "/var/www/:/tmp/" # 正確:修改 php.ini 或 .user.ini # php.ini: open_basedir = "/var/www/:/tmp/" # 或項目目錄建立 .user.ini # open_basedir = "/var/www/:/tmp/" # 等待 300 秒生效(或重啟 PHP-FPM 即時)
https://www.php.net/manual/zh/ini.list.php
php -i | grep memory_limit # 輸出包含:memory_limit => 128M => 128M # 格式:指令 => 本地值 => 主值
<?php
echo ini_get('memory_limit'); // 128M
echo ini_get_all()['memory_limit']['access']; // 7 (PHP_INI_SYSTEM=4 | PHP_INI_PERDIR=2 | PHP_INI_USER=1)
// access 值對應:4=SYSTEM, 2=PERDIR, 1=USER, 7=ALL
?>
掌握修改範圍機制,配置管理不再踩坑。