檔案上傳能否順利完成、大小限制、暫存路徑、執行逾時,全由 php.ini 掌控。本文系統整理 7 大核心參數、修改生效流程、多環境定位技巧、Nginx/Apache 協同配置,並提供生產環境建議值速查表。
| 參數 | 預設值 | 建議生產值 | 作用層級 | 說明 |
|---|---|---|---|---|
| file_uploads | On | On | PHP_INI_SYSTEM | 總開關,關閉則 $_FILES 永遠為空 |
| upload_tmp_dir | 系統預設(/tmp) | /var/tmp/php_upload | PHP_INI_SYSTEM | 暫存目錄,**須可寫、獨立、設定 sticky bit (1777)**,防止其他用戶刪改 |
| upload_max_filesize | 2M | 10M~50M | PHP_INI_PERDIR | 單一檔案上限,**受限於 post_max_size** |
| post_max_size | 8M | 12M~60M | PHP_INI_PERDIR | 整個 POST 請求體上限,**必須 > upload_max_filesize**,含所有表單欄位 |
| memory_limit | 128M | 256M~512M | PHP_INI_ALL | 腳本記憶體上限,**需 > post_max_size**,大檔處理(縮圖、解析)易 OOM |
| max_execution_time | 30 | 60~300 | PHP_INI_ALL | 腳本最大執行秒數,**CLI 模式下無效**(0=無限制),大檔上傳需放寬 |
| max_input_time | 60 | 60~300 | PHP_INI_PERDIR | 解析 POST/GET 資料最大秒數,**含檔案上傳接收時間**,慢速網路需調大 |
memory_limit
≥ post_max_size
≥ upload_max_filesize
≥ 單檔實際大小
max_input_time ≥ 上傳耗時(受網速影響)
max_execution_time ≥ 處理耗時(含移動、縮圖、掃毒)
# CLI
php --ini
# FPM
php-fpm -i | grep 'Loaded Configuration File'
# 或建立 info.php
<?php phpinfo(); ?>
; 註解。# PHP-FPM
systemctl reload php-fpm
# Apache (mod_php)
systemctl reload apache2
# Nginx + FPM 僅需 reload php-fpm
phpinfo() 或 php -i | grep upload_max_filesize 確認。| 原因 | 排查指令 | 解決 |
|---|---|---|
| 編輯錯誤的 ini 檔 | php --ini 對比 phpinfo() 路徑 | 以 Loaded Configuration File 為準 |
| 參數層級不匹配 | php -i | grep 'upload_max_filesize' 觀察 Master Value vs Local Value | PHP_INI_SYSTEM 僅 php.ini;PHP_INI_PERDIR 可 .htaccess/user.ini |
| Nginx client_max_body_size 更小 | grep client_max_body_size /etc/nginx/nginx.conf | 同步調大 Nginx client_max_body_size 60M; |
| Apache LimitRequestBody 限制 | grep LimitRequestBody /etc/apache2/apache2.conf | 移除或調大 |
| 未重載服務 | 檢查進程啟動時間 ps aux | grep php-fpm | 必須 reload/restart |
; /etc/php/8.2/fpm/php.ini
file_uploads = On
upload_tmp_dir = /var/tmp/php_upload
upload_max_filesize = 10M
post_max_size = 12M
memory_limit = 256M
max_execution_time = 120
max_input_time = 120
; 針對大檔上傳可考慮啟用
; session.gc_maxlifetime = 7200
; opcache.enable = 1
# 建立暫存目錄
mkdir -p /var/tmp/php_upload
chown www-data:www-data /var/tmp/php_upload
chmod 1777 /var/tmp/php_upload # sticky bit:只有擁有者能刪除自己的檔案
# 上傳落地目錄(Webroot 外)
mkdir -p /var/www/uploads
chown www-data:www-data /var/www/uploads
chmod 755 /var/www/uploads
若無權修改主 php.ini,可在專案根目錄建立 .user.ini(需 user_ini.filename = ".user.ini"):
upload_max_filesize = 20M
post_max_size = 25M
max_execution_time = 180
max_input_time = 180
生效延遲 user_ini.cache_ttl 秒(預設 300 秒),修改後需等待或重載 FPM。
php.ini 上傳參數調校核心在於 「記憶體 ≥ POST ≥ 單檔、時間足夠接收與處理、暫存目錄獨立安全、Web 伺服器同步放寬」。建立標準化配置範本、納入基礎設施即代碼(IaC),新環境部署一鍵套用,避免「本地測試正常、上線失敗」的經典坑。