PHP 5.3 版本重大調整了 php.ini 範本檔案命名與定位,導致許多開發者在升級時感到困惑。本文釐清四種檔案的對應關係、適用場景、核心差異與遷移建議。
| PHP ≤ 5.2 | PHP ≥ 5.3 | 用途 | 安全性 |
|---|---|---|---|
php.ini-dist | php.ini-development | 開發環境 | 較低(錯誤顯示開啟、嚴格模式關閉) |
php.ini-recommended | php.ini-production | 生產環境 | 較高(錯誤隱藏、嚴格模式開啟、安全相關指令值較嚴格) |
| 指令 | development | production | 影響 |
|---|---|---|---|
display_errors | On | Off | 生產環境不應直接向用戶顯示錯誤細節 |
display_startup_errors | On | Off | 啟動階段錯誤同理 |
error_reporting | E_ALL | E_ALL & ~E_DEPRECATED & ~E_STRICT | 開發環境看盡所有警告;生產環境隱藏棄用/嚴格標準警告 |
log_errors | On | On | 兩者都應記錄錯誤日誌 |
error_log | /var/log/php_errors.log | /var/log/php_errors.log | 建議統一指定絕對路徑 |
html_errors | On | Off | 生產環境不輸出 HTML 格式錯誤 |
expose_php | On | Off | 生產環境隱藏 PHP 版本資訊(X-Powered-By 標頭) |
allow_url_fopen | On | Off | 生產環境建議關閉遠端檔案開啟,防 SSRF |
allow_url_include | Off | Off | 兩者皆關,防遠端程式碼注入 |
session.cookie_httponly | On | On | 防 XSS 竊取 Session ID |
session.cookie_secure | Off | On | 生產環境強制 HTTPS 傳輸 Cookie |
session.use_strict_mode | On | On | 防 Session Fixation 攻擊 |
# Linux/macOS
cp /path/to/php/php.ini-development /usr/local/etc/php/8.2/php.ini
# 或 PHP 安裝目錄下
cp php.ini-development php.ini
# Windows
copy php.ini-development php.ini
開發機建議額外調整:
; 開發專屬優化
xdebug.mode = develop,debug
xdebug.start_with_request = yes
opcache.enable = 0 ; 開發時關閉 OPcache 即時生效
opcache.validate_timestamps = 1
max_execution_time = 300 ; 方便除錯長時間腳本
memory_limit = 512M
cp php.ini-production php.ini
生產機必要微調(視架構而定):
; 效能優化
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 0 ; 部署後才重啟 PHP-FPM 生效
opcache.jit = tracing ; PHP 8.0+ JIT 編譯
; 安全強化
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,pcntl_exec
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
session.cookie_secure = 1
session.cookie_samesite = "Strict"
; 上傳/資源限制
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 30
memory_limit = 128M
原因:PHP 5.3+ 重新命名範本檔。
解決:下載對應版本 PHP 原始碼包,或從官網 GitHub 取得最新範本。
原因:新版 PHP 新增/移除/重命名指令(如 register_globals、magic_quotes_gpc 已移除)。
解決:務必以新版範本為基礎,再套用自訂設定,而非沿用舊檔。
php --ini
# 輸出範例:
# Configuration File (php.ini) Path: /usr/local/etc/php/8.2
# Loaded Configuration File: /usr/local/etc/php/8.2/php.ini
# Scan for additional .ini files in: /usr/local/etc/php/8.2/conf.d
或在腳本中:
php -i | grep "Loaded Configuration File"
# 或
echo php_ini_loaded_file();
# 目錄結構
/php.ini # 基礎共通設定
/php.ini.development.local # 開發機覆蓋(不納入版控)
/php.ini.production.local # 生產機覆蓋(不納入版控)
# PHP-FPM 池設定引入
; www.conf
php_admin_value[include_path] = /etc/php/8.2/conf.d
; 在 conf.d 中放置 99-local.ini symlink 指向對應環境檔
# Dockerfile
FROM php:8.2-fpm
COPY php.ini-production /usr/local/etc/php/php.ini
# 執行時以環境變數覆蓋關鍵設定
# docker run -e PHP_MEMORY_LIMIT=256M -e PHP_OPCACHE_VALIDATE_TIMESTAMPS=0 ...
配合 php.ini 使用 ${ENV_VAR} 語法(PHP 7.0+):
memory_limit = ${PHP_MEMORY_LIMIT:-128M}
opcache.validate_timestamps = ${PHP_OPCACHE_VALIDATE_TIMESTAMPS:-1}
php.ini.j2,變數化環境差異symfony/config)# CLI
php -i | grep -E 'display_errors|error_reporting|opcache.enable'
# Web(建立 info.php 臨時檔案,用完即刪)
development = 開發、production = 生產php.ini 再修改