萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

php.ini 設定檔演進:development、production、dist、recommended 差異詳解

PHP 5.3 版本重大調整了 php.ini 範本檔案命名與定位,導致許多開發者在升級時感到困惑。本文釐清四種檔案的對應關係、適用場景、核心差異與遷移建議。

檔案對應關係速查表

PHP ≤ 5.2PHP ≥ 5.3用途安全性
php.ini-distphp.ini-development開發環境較低(錯誤顯示開啟、嚴格模式關閉)
php.ini-recommendedphp.ini-production生產環境較高(錯誤隱藏、嚴格模式開啟、安全相關指令值較嚴格)

核心差異對照

指令developmentproduction影響
display_errorsOnOff生產環境不應直接向用戶顯示錯誤細節
display_startup_errorsOnOff啟動階段錯誤同理
error_reportingE_ALLE_ALL & ~E_DEPRECATED & ~E_STRICT開發環境看盡所有警告;生產環境隱藏棄用/嚴格標準警告
log_errorsOnOn兩者都應記錄錯誤日誌
error_log/var/log/php_errors.log/var/log/php_errors.log建議統一指定絕對路徑
html_errorsOnOff生產環境不輸出 HTML 格式錯誤
expose_phpOnOff生產環境隱藏 PHP 版本資訊(X-Powered-By 標頭)
allow_url_fopenOnOff生產環境建議關閉遠端檔案開啟,防 SSRF
allow_url_includeOffOff兩者皆關,防遠端程式碼注入
session.cookie_httponlyOnOn防 XSS 竊取 Session ID
session.cookie_secureOffOn生產環境強制 HTTPS 傳輸 Cookie
session.use_strict_modeOnOn防 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

常見遷移問題與解決

問題 1:升級後找不到舊檔案

原因:PHP 5.3+ 重新命名範本檔。
解決:下載對應版本 PHP 原始碼包,或從官網 GitHub 取得最新範本。

問題 2:直接複製舊 php.ini 導致警告/錯誤

原因:新版 PHP 新增/移除/重命名指令(如 register_globals、magic_quotes_gpc 已移除)。
解決:務必以新版範本為基礎,再套用自訂設定,而非沿用舊檔。

問題 3:不確定當前載入哪個 php.ini

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 指向對應環境檔

方案二:環境變數注入(Docker/雲原生)

# 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}

方案三:配置管理工具

  • Ansible/Chef/Puppet:模板化 php.ini.j2,變數化環境差異
  • Laravel Valet / Symfony CLI:自動管理開發環境 PHP 版本與配置
  • PHP Config Library:程式化建構配置(如 symfony/config)

驗證配置生效

# CLI
php -i | grep -E 'display_errors|error_reporting|opcache.enable'

# Web(建立 info.php 臨時檔案,用完即刪)

總結

  • PHP 5.3+ 統一命名:development = 開發、production = 生產
  • 絕不直接編輯範本檔,複製為 php.ini 再修改
  • 升級 PHP 版本必須以新版範本為基礎合併舊設定
  • 生產環境核心三原則:錯誤不顯示、日誌必記錄、資訊不洩露
  • 現代部署採環境變數覆蓋,配置與程式碼分離,支援多環境一致性
copyright © 萬盛學電腦網 all rights reserved