本文承接基礎篇,深入解析 php.ini 中關於 資料處理順序、檔案上傳、動態擴展載入、資料庫連線池 以及 Session 管理 的關鍵指令。適用於 PHP 4.x/5.x 早期版本,現代 PHP 7/8 部分指令已棄用或重命名,請以官方文件為準。
; EGPCS 代表 Environment, GET, POST, Cookie, Server
; 從左至右解析,後者覆蓋前者
variables_order = "EGPCS"
; 是否將 EGPCS 註冊為全域變數($var)
; 生產環境強烈建議 Off,改用超全域陣列 $_GET 等
register_globals = Off
; 是否註冊 $argc/$argv(命令列參數)
register_argc_argv = Off
最佳實踐:register_globals=Off 配合 track_vars=On(預設開啟),統一使用 $_POST['name'] 風格,消除變量覆蓋風險。
| 指令 | 預設值 | 說明 |
|---|---|---|
| file_uploads | On | 總開關,關閉可阻斷所有上傳 |
| upload_max_filesize | 2M | 單檔上限,需配合 post_max_size > upload_max_filesize |
| upload_tmp_dir | 系統預設 | 臨時儲存路徑,建議指定獨立分區且設 open_basedir |
| post_max_size | 8M | POST 總體大小,含所有表單欄位與檔案 |
; 擴展檔案目錄(絕對路徑)
extension_dir = "C:/php/ext" ; Windows
extension_dir = "/usr/lib/php/extensions" ; Linux
; 啟用 dl() 函數動態載入(多執行緒 SAPI 如 IIS 必須關閉)
enable_dl = Off
; 具體模組啟用範例
extension=php_mysql.dll
extension=php_gd2.dll
extension=php_mbstring.dll
; extension=php_oci8.dll ; Oracle 需額外客戶端庫
注意:Windows 下 php_mysql.dll 在 PHP 5.3+ 已內建,無需額外載入;Linux 通常編譯時指定 --with-mysql。
以 MySQL 區塊為例,其他資料庫(PostgreSQL、ODBC、Sybase、MSSQL 等)結構類似:
[MySQL]
mysql.allow_persistent = On ; 允許 mysql_pconnect()
mysql.max_persistent = -1 ; 持久連線上限(-1 無限制)
mysql.max_links = -1 ; 總連線上限(含非持久)
mysql.default_port = 3306
mysql.default_socket = /tmp/mysql.sock
; 生產環境嚴禁在 ini 寫死帳密!
; mysql.default_user =
; mysql.default_password =
原則:Web 應用優先使用持久連線減少握手開銷;CLI 腳本或長時間任務改用非持久連線避免佔用槽位。
[Session]
session.save_handler = files ; 或 redis, memcached
session.save_path = "/var/lib/php/session" ; 需預先建立目錄並設 700 權限
session.use_cookies = 1 ; 傳遞 SID 僅靠 Cookie
session.use_only_cookies = 1 ; 防止 URL 重寫攻擊
session.name = PHPSESSID
session.auto_start = 0 ; 手動 session_start() 控制
session.cookie_lifetime = 0 ; 瀏覽器關閉即失效
session.cookie_httponly = 1 ; JS 無法讀取 Cookie(需 PHP 5.2+)
session.cookie_secure = 1 ; 僅 HTTPS 傳輸(需全站 SSL)
session.gc_probability = 1
session.gc_divisor = 1000 ; 1/1000 機率觸發 GC
session.gc_maxlifetime = 1440 ; 24 分鐘無活動視為垃圾
session.cache_limiter = nocache
session.cache_expire = 180
高併發優化:將 save_handler 改為 redis 或 memcached,並啟用 session.locking 機制防止競態條件。
[mail function]:SMTP、sendmail_from(僅 Windows)、sendmail_path(Linux)[Java]:java.class.path、java.home —— PHP/Java Bridge 專用[bcmath]:bcmath.scale = 2 設定預設小數位[browscap]:browscap = /etc/php/browscap.ini 啟用 get_browser()expose_php = Off 隱藏 X-Powered-By 標頭display_errors = Off、log_errors = On、error_log = /var/log/php/error.logdisable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_sourceopen_basedir = /var/www/:/tmp/:/var/lib/php/session/ 限制腳本可訪問目錄allow_url_fopen = Off、allow_url_include = Off 禁止遠端檔案包含配置修改後必須重啟 PHP-FPM 或 Apache 才能生效。建議維護 php.ini.production 版本納入版控,部署時以模板渲染產生最終檔案。