php.ini 核心角色
php.ini 是 PHP 執行期的核心配置檔,控制記憶體限制、錯誤處理、檔案上傳、擴展載入、Session 管理等數百項設定。正確調優對效能、安全、穩定性至關重要。
配置檔載入順序
- 當前工作目錄下的
php.ini
PHPRC 環境變數指定路徑
- 編譯時指定的預設路徑(Windows 為系統目錄,Linux 為
/etc/php/版本/php.ini)
- CLI 模式可用
-c 參數覆蓋
核心區塊詳細解析
🔧 語言核心選項
| 指令 | 預設值 | 建議生產值 | 說明 |
| engine | On | On | 啟用 PHP 引擎 |
| short_open_tag | On | Off | 關閉短標籤 <? ?>,提升可移植性 |
| precision | 14 | 14 | 浮點數顯示精度 |
| output_buffering | Off | 4096 | 開啟輸出緩衝,減少網路封包,允許 header 後發送 |
| expose_php | On | Off | 隱藏 HTTP Header 中的 PHP 版本資訊(安全) |
| max_execution_time | 30 | 30-60 | 腳本最大執行秒數(0=無限制,僅 CLI) |
| memory_limit | 128M | 256M-512M | 單腳本記憶體上限,視應用調整 |
🛡️ 錯誤處理與日誌(生產環境關鍵)
| 指令 | 開發環境 | 生產環境 | 說明 |
| error_reporting | E_ALL | E_ALL & ~E_DEPRECATED & ~E_STRICT | 回報等級 |
| display_errors | On | Off | ❌ 生產環境絕不可開啟,洩漏敏感資訊 |
| display_startup_errors | On | Off | 啟動階段錯誤顯示 |
| log_errors | On | On | ✅ 必須開啟錯誤日誌 |
| error_log | /var/log/php/error.log | /var/log/php/error.log | 指定日誌路徑,需可寫入權限 |
| log_errors_max_len | 1024 | 0 (無限制) | 單筆日誌最大長度 |
| ignore_repeated_errors | Off | On | 忽略重複錯誤減少日誌噪音 |
| html_errors | On | Off | 生產環境關閉 HTML 格式化 |
📁 檔案上傳與資源限制
| 指令 | 預設值 | 建議值 | 說明 |
| file_uploads | On | On | 啟用 HTTP 檔案上傳 |
| upload_max_filesize | 2M | 10M-100M | 單檔上傳上限,需搭配 post_max_size |
| post_max_size | 8M | > upload_max_filesize | POST 資料總上限,必須 > upload_max_filesize |
| max_file_uploads | 20 | 20-50 | 單次請求最大檔案數 |
| upload_tmp_dir | 系統暫存目錄 | /tmp/php_uploads | 指定專用暫存目錄,確保權限安全 |
🌐 網路與資料處理
| 指令 | 預設值 | 建議值 | 說明 |
| allow_url_fopen | On | Off | ❌ 禁用遠端檔案存取(安全),改用 cURL |
| allow_url_include | Off | Off | 嚴禁包含遠端檔案(極高風險) |
| default_socket_timeout | 60 | 30 | Socket 逾時秒數,避免掛住 |
| variables_order | EGPCS | GPCS | 移除 E(ENV) 減少變數汙染 |
| request_order | GP | GP | $_REQUEST 合併順序,建議不含 C(Cookie) |
| max_input_vars | 1000 | 3000-5000 | 防止 HashDoS 攻擊,複雜表單需調大 |
💾 Session 管理
| 指令 | 預設值 | 建議值 | 說明 |
| session.save_handler | files | files/redis/memcached | 分散式環境需用共享儲存 |
| session.save_path | /tmp | /var/lib/php/sessions | 檔案儲存路徑,可用 N;MODE;PATH 分層 |
| session.gc_maxlifetime | 1440 | 1440-7200 | Session 存活秒數(24分鐘-2小時) |
| session.cookie_httponly | Off | On | ✅ 防止 XSS 竊取 Session ID |
| session.cookie_secure | Off | On (HTTPS) | ✅ 僅 HTTPS 傳輸 Cookie |
| session.use_strict_mode | Off | On | ✅ 防止 Session Fixation 攻擊 |
| session.sid_length | 32 | 48 | Session ID 長度,越長越安全 |
🚀 效能優化關鍵設定
| 指令 | 建議值 | 影響 |
| realpath_cache_size | 4096K | 路徑解析快取,大型專案必調大 |
| realpath_cache_ttl | 300 | 快取存活秒數 |
| opcache.enable | 1 | ✅ 必須開啟 OPcache(PHP 5.5+ 內建) |
| opcache.memory_consumption | 128-256 | OPcache 共享記憶體 (MB) |
| opcache.max_accelerated_files | 10000-20000 | 快取檔案數上限,設大於專案檔案數 |
| opcache.validate_timestamps | 1(開發)/0(生產) | 生產環境關閉以獲最大效能,部署需重啟 PHP |
| opcache.jit | 1255 (PHP 8+) | 啟用 JIT 編譯,CPU 密集型任務提升明顯 |
🔒 安全相關(必須檢查)
- disable_functions:
exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,pcntl_exec, 等危險函式
- disable_classes:禁用敏感類別
- open_basedir:限制檔案操作目錄,如
/var/www/:/tmp/
- session.cookie_samesite:
Lax 或 Strict(PHP 7.3+)防禦 CSRF
環境差異化配置策略
開發環境
display_errors = On
error_reporting = E_ALL
opcache.validate_timestamps = 1
xdebug.mode = develop,debug
生產環境
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
opcache.validate_timestamps = 0
expose_php = Off
allow_url_fopen = Off
session.cookie_secure = 1
session.cookie_httponly = 1
驗證配置生效
<?php
// 1. CLI 檢查
php -i | grep "memory_limit"
// 2. 網頁端檢查
phpinfo(); // 搜尋 "Loaded Configuration File"
// 3. 程式碼檢查特定值
echo ini_get('memory_limit'); // 回傳字串
echo ini_get('display_errors'); // 回傳 "1" 或 "0"
?>
總結:生產環境必檢清單
- ✅
display_errors = Off
- ✅
log_errors = On + error_log 路徑正確
- ✅
expose_php = Off
- ✅
allow_url_fopen = Off
- ✅
session.cookie_httponly = On + session.cookie_secure = On (HTTPS)
- ✅
opcache.enable = 1 + 記憶體/檔案數調優
- ✅
disable_functions 含危險函式
- ✅
open_basedir 限制存取路徑
- ✅
memory_limit / max_execution_time 符合業務需求
- ✅
upload_max_filesize < post_max_size
妥善配置 php.ini 是 PHP 應用穩定、安全、高效運行的基石。建議將配置納入版本控制,採用環境變數覆蓋或多環境配置檔策略管理差異。