php.ini是PHP運行時的核心配置文件,合理調優其參數能顯著提升應用性能、增強安全性、規範開發行為。本文針對開發與生產環境的關鍵配置項進行深度解析,提供基於實戰經驗的最佳實踐建議,幫助開發者構建高效穩定的PHP運行環境。
PHP啟動時按以下優先級查找加載php.ini:
PHPIniDir、CLI的-c參數)PHPRC環境變量指定路徑HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath)--with-config-file-path)執行php --ini或phpinfo()可查看實際加載的配置文件路徑。
| 指令 | 推薦值(開發) | 推薦值(生產) | 說明 |
|---|---|---|---|
| error_reporting | E_ALL | E_STRICT | E_ALL & ~E_DEPRECATED & ~E_STRICT | 開發環境開啟所有錯誤含嚴格標準,生產環境隱藏棄用與嚴格提示 |
| display_errors | On | Off | 生產環境嚴禁直接輸出錯誤到頁面,防止信息洩露 |
| log_errors | On | On | 始終啟用錯誤日志記錄 |
| error_log | /var/log/php_errors.log | /var/log/php_errors.log | 指定絕對路徑,確保Web進程有寫入權限 |
| display_startup_errors | On | Off | 啟動階段錯誤顯示控制 |
| track_errors | Off | Off | 不推薦使用$php_errormsg變量,已棄用 |
| 指令 | 推薦值 | 說明 |
|---|---|---|
| max_execution_time | 30-60 | 腳本最大執行秒數,防止死循環佔用資源。CLI模式默認0(無限制) |
| memory_limit | 128M-256M | 單腳本內存上限,視應用複雜度調整。-1表示無限制(危險) |
| max_input_time | 60 | 解析POST/GET/上傳數據最大秒數,大文件上傳需調大 |
| post_max_size | 16M-64M | POST數據總大小限制,必須大於upload_max_filesize |
| upload_max_filesize | 10M-50M | 單文件上傳上限,配合post_max_size使用 |
| max_file_uploads | 20 | 單次請求最大上傳文件數 |
| upload_tmp_dir | /tmp/php_upload | 上傳臨時目錄,需Web進程可寫,建議獨立分區防磁盤滿 |
| 指令 | 推薦值 | 說明 |
|---|---|---|
| expose_php | Off | 隱藏HTTP頭中的PHP版本信息(X-Powered-By) |
| allow_url_fopen | Off | 禁用遠程文件打開,防止RF攻擊。需用cURL替代 |
| allow_url_include | Off | 嚴禁遠程文件包含,極高風險 |
| disable_functions | exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,pcntl_exec,putenv | 禁用高危函數,根據業務需要微調 |
| disable_classes | 禁用危險類,通常留空 | |
| open_basedir | /var/www/:/tmp/:/var/tmp/ | 限制文件操作目錄範圍,防止目錄遍歷。多目錄用冒號分隔 |
| session.cookie_httponly | 1 | 防止JS訪問Session ID,緩解XSS風險 |
| session.cookie_secure | 1(HTTPS環境) | 僅HTTPS傳輸Cookie |
| session.use_strict_mode | 1 | 嚴格模式拒絕未初始化的Session ID |
; 內部編碼統一為UTF-8
default_charset = "UTF-8"
input_encoding = "UTF-8"
output_encoding = "UTF-8"
internal_encoding = "UTF-8"
; mbstring擴展配置
mbstring.language = neutral
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0
date.timezone = Asia/Shanghai
; 或 PRC (人民共和國)
未設置將產生E_WARNING並默認使用UTC,導致時間計算偏差8小時。
; 擴展庫目錄(絕對路徑)
extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20190902"
; 常用擴展按需啟用
extension=bcmath
extension=curl
extension=gd2
extension=mbstring
extension=mysqli
extension=pdo_mysql
extension=redis
extension=opcache
extension=zip
extension=intl
注意:Windows下文件名為php_xxx.dll,Linux為xxx.so。PHP 7.2+不再需要在ini中指定extension=前綴,直接寫擴展名即可。
PHP 5.5+內置OPcache,生產環境必開:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.validate_timestamps=1
opcache.save_comments=1
開發環境設置opcache.revalidate_freq=0實現即時生效。
PHP 5.3+提供兩套模板:php.ini-development與php.ini-production,部署時請選擇對應版本。
# 語法檢查
php -i | grep "Loaded Configuration File"
php -m # 查看已加載擴展
php -r "phpinfo();" | grep -A 5 "Configuration File"
# 平滑重載 (PHP-FPM)
kill -USR2 $(cat /usr/local/php/var/run/php-fpm.pid)
# 或
systemctl reload php-fpm
php.ini配置是PHP應用性能與安全的基石。核心原則:
建議將php.ini納入版本控制,通過CI/CD流程實現配置的環境化部署與審計追蹤。