
php.ini 常用設定說明
先確認設定檔在哪
php --ini
輸出會列出載入的主設定檔與額外的設定目錄。命令列與網頁環境可能使用不同的設定檔,網頁端請用 phpinfo() 確認。
使用 PHP-FPM 時,行程池的設定檔(如 www.conf)也可能覆蓋部分設定。
錯誤處理:正式與開發環境要分開
正式環境
display_errors = Off display_startup_errors = Off log_errors = On error_log = /var/log/php/error.log error_reporting = E_ALL & ~E_DEPRECATED
正式環境絕不能顯示錯誤訊息。 錯誤內容可能洩漏檔案路徑、資料庫結構等資訊,這是實際的資安風險。
開發或測試環境
display_errors = On error_reporting = E_ALL
測試環境建議包含棄用通知,因為那是下一版的致命錯誤。
錯誤日誌的位置
若 error_log 未指定,錯誤可能被寫進網頁伺服器的錯誤日誌。建議明確指定路徑,並確認 PHP 執行身分有寫入權限。
記憶體與執行時間
memory_limit = 256M max_execution_time = 60 max_input_time = 60
memory_limit 怎麼抓
- 一般企業網站——128M 到 256M 通常足夠
- 有圖片處理、報表匯出——可能需要更高
- 不要無限制地調高——它是單一請求的上限,設太高會讓失控的程式吃光主機記憶體
這個值與 PHP-FPM 的 pm.max_children 互相關聯:max_children × 單一行程的實際用量,不能超過可用記憶體。
行程池的估算見網頁伺服器的效能相關設定。
執行時間的注意事項
max_execution_time 不計入等待外部資源的時間(例如資料庫查詢、外部 API 呼叫)。所以有時候明明設了 30 秒,實際卻跑了更久。
長時間作業應改為背景排程,不要靠拉長逾時解決。
檔案上傳
file_uploads = On upload_max_filesize = 32M post_max_size = 40M max_file_uploads = 20
三個值要一起看
- post_max_size 必須大於 upload_max_filesize——因為除了檔案還有其他表單欄位
- memory_limit 通常應大於 post_max_size
- 網頁伺服器端也要調整——Nginx 的
client_max_body_size,否則會得到 413 錯誤
只改一處是最常見的錯誤,結果是改了半天上傳還是失敗。
Session
session.cookie_httponly = 1 session.cookie_secure = 1 session.cookie_samesite = "Lax" session.use_strict_mode = 1 session.gc_maxlifetime = 1440
四個安全相關的設定
- cookie_httponly——禁止前端程式讀取,降低被竊取的風險
- cookie_secure——僅在加密連線傳送。全站已是 https 才能開啟,否則登入會失效
- cookie_samesite——限制跨站傳送,降低跨站請求偽造的風險
- use_strict_mode——拒絕未經伺服器產生的 session 編號,防止 session 固定攻擊
多台伺服器的情況
預設的 session 存在本機檔案系統。若有多台伺服器負載平衡,需改用共用的儲存機制,否則使用者會頻繁被登出。
時區與語系
date.timezone = "Asia/Taipei"
務必明確設定,否則日期時間的計算可能與預期不符——排程、訂單時間、報表都會受影響。
安全相關的設定
expose_php = Off allow_url_fopen = Off allow_url_include = Off
- expose_php——關閉後回應標頭不會顯示 PHP 版本
- allow_url_fopen——關閉可降低遠端檔案讀取的風險。但部分套件會用到,關閉前需確認
- allow_url_include——應保持關閉,這是嚴重的風險來源
關於 disable_functions
可停用高風險的函式,例如系統指令執行相關的函式。但要先確認應用程式沒有使用到,否則會導致功能失效。
停用清單應依實際情況評估,不要照抄網路上的範例。
不同層級的設定方式
| 層級 | 方式 | 適用 |
|---|---|---|
| 全域 | php.ini | 整台伺服器 |
| 行程池 | FPM 設定中的 php_admin_value | 各站台不同設定 |
| 目錄 | .user.ini 或 .htaccess | 特定目錄 |
| 程式中 | ini_set() | 執行期間,部分設定無效 |
用 php_admin_value 設定的項目無法被程式中的 ini_set 覆蓋,適合用於安全相關的設定。
修改後要驗證
- 重載 PHP-FPM——
systemctl reload php8.3-fpm - 用 phpinfo() 確認實際生效的值——不要只相信改了設定檔
- 確認錯誤日誌沒有新的問題
第二項很重要——設定可能被其他層級覆蓋,或改到了不是實際載入的那個檔案。
本文的設定與語法以 PHP 8.x 為例,實際的參數、預設值與支援狀態可能因版本與發行版而異。各版本的支援時程請以 PHP 官方公告為準。套用前請先在測試環境驗證,並確實備份原設定檔。