PHP 預設上傳限制為 2MB,實務上常需支援超大檔案(如影片、安裝包)。本文系統整理 php.ini 關鍵參數、Apache/Nginx 相關設定與程式碼層面注意事項,助你一次配置成功。
| 參數 | 預設值 | 說明 | 建議值(>100MB 範例) |
|---|---|---|---|
file_uploads | On | 啟用 HTTP 上傳 | On |
upload_max_filesize | 2M | 單一檔案最大值 | 200M |
post_max_size | 8M | POST 總資料上限(含所有表單欄位) | 210M (需 > upload_max_filesize) |
upload_tmp_dir | 系統暫存目錄 | 暫存檔儲存路徑(需可寫入、空間足夠) | /var/tmp/php_upload |
| 參數 | 預設值 | 說明 | 建議值 |
|---|---|---|---|
max_execution_time | 30 | 腳本最大執行秒數(0=無限制) | 600 |
max_input_time | 60 | 接收 POST 資料最大秒數 | 600 |
memory_limit | 128M | 腳本記憶體上限(處理大檔案時可能飆升) | 512M |
# nginx.conf 或 site conf client_max_body_size 210m; # 必須 >= post_max_size proxy_read_timeout 600s; # 反向代理時防止上傳中斷
# httpd.conf 或 .htaccess LimitRequestBody 220200960 # 210MB(bytes),僅適用 mod_php # php-fpm 需在 pool 設定 php_admin_value[post_max_size] 等
超過 500MB 或行動裝置環境,建議採用前端切片(如 Resumable.js、Uppy)配合後端合併策略,避免單一請求超時、記憶體暴漲。
php.ini 後**必須重啟 php-fpm / Apache / Nginx** 生效。post_max_size 必須 **大於** upload_max_filesize,否則大檔案會被截斷且 $_FILES['file']['error'] 回傳 1(UPLOAD_ERR_INI_SIZE)。upload_tmp_dir 目錄權限(chown www-data:www-data /var/tmp/php_upload && chmod 755)。$_FILES['file']['tmp_name'] 處理,記得 move_uploaded_file() 完成後原暫存檔會自動刪除,若需保留請先複製。大檔案上傳涉及 PHP、Web Server、前端、作業系統多層限制,逐項排查並配合分塊上傳架構,才能打造穩定可靠的上傳體驗。建議將上述參數集中管理於 Ansible/Docker Compose 等部署腳本,避免環境不一致導致上線事故。