php.ini 是 PHP 引擎啟動時讀取的主設定檔,控制記憶體、上傳、錯誤處理、擴充模組載入等核心行為。本文針對常見生產環境調整項目,提供中文說明與建議值。
php.iniPHPRC 指定路徑/etc/php/版本/cli|fpm/php.ini)CLI 模式可用 php -c /path/to/php.ini 指定;修改後必須重啟 PHP-FPM 或 Apache 才生效。
| 指令 | 建議值 | 說明 |
|---|---|---|
| engine | On | 啟用 PHP 引擎,關閉則不解析 PHP 程式碼 |
| short_open_tag | Off | 關閉 <? ... ?> 短標籤,避免與 XML 衝突,提升可移植性 |
| precision | 14 | 浮點數顯示精度 |
| output_buffering | 4096 | 開啟輸出緩衝,允許在輸出內容後再送 header,建議給定具體大小而非 On |
| expose_php | Off | 隱藏 HTTP Header 中的 X-Powered-By: PHP/...,降低資訊洩露風險 |
| 指令 | 建議值 | 說明 |
|---|---|---|
| max_execution_time | 30 | 腳本最大執行秒數,CLI 為 0(無限制) |
| memory_limit | 256M | 單腳本記憶體上限,視專案複雜度調整 |
| post_max_size | 64M | POST 資料總大小上限,需大於 upload_max_filesize |
| upload_max_filesize | 20M | 單檔上傳上限 |
| 指令 | 建議值 | 說明 |
|---|---|---|
| error_reporting | E_ALL & ~E_DEPRECATED & ~E_STRICT | 回報所有錯誤但排除棄用與嚴格標準提示 |
| display_errors | Off | 生產環境嚴禁直接輸出錯誤到瀏覽器,防洩漏路徑、SQL 等敏感資訊 |
| log_errors | On | 啟用錯誤日誌寫入檔案或 syslog |
| error_log | /var/log/php/error.log | 指定專屬錯誤日誌路徑,確保目錄可寫 |
| ignore_repeated_errors | On | 避免重複錯誤刷滿日誌 |
| 指令 | 建議值 | 說明 |
|---|---|---|
| session.save_handler | files / redis | 單機用 files,叢集建議改 redis/memcached |
| session.save_path | "2;/var/lib/php/sessions" | 啟用子目錄分散儲存,提升大量 session 效能 |
| session.gc_maxlifetime | 1440 | 垃圾回收存活秒數(24 分鐘) |
| session.cookie_httponly | 1 | 禁止 JavaScript 讀取 session cookie,防 XSS |
| session.use_strict_mode | 1 | 拒絕未初始化的 session ID,防固定攻擊 |
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source —— 封鎖高風險函式disable_classes = —— 視需求禁用敏感類別open_basedir = /var/www/:/tmp/ —— 限制檔案操作目錄,防目錄遍歷allow_url_fopen = Off / allow_url_include = Off —— 禁止遠端檔案包含僅啟用專案真正需要的模組,減少記憶體佔用與攻擊面:
extension=pdo_mysql
extension=redis
extension=opcache
extension=mbstring
extension=json
; extension=gd ; 視需求開啟
[opcache]
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60 ; 生產環境 60 秒檢查一次,開發環境設 0
opcache.fast_shutdown=1
systemctl reload php-fpm 或 apachectl gracefulphp --ini 確認.user.ini 覆蓋:Nginx + PHP-FPM 架構下,目錄下的 .user.ini 會覆蓋主設定,需留意php.ini 調優是效能與安全的基石。建議維護一份「專案專用 php.ini 模板」,部署時以配置管理工具(Ansible、Dockerfile)分發,確保環境一致性。