PHP 上傳核心參數解析
| 參數 | 預設 | 建議值(大檔) | 說明 |
| file_uploads | On | On | 總開關 |
| upload_tmp_dir | 系統預設 | /data/tmp/upload | 獨立分區、noexec、大空間 |
| upload_max_filesize | 2M | 50M | 單檔上限 |
| post_max_size | 8M | 60M | POST 總體上限,必須 > upload_max_filesize |
| max_execution_time | 30 | 300 | 腳本最大執行秒數 |
| max_input_time | 60 | 300 | 接收 POST 資料最大秒數 |
| memory_limit | 8M | 128M | 腳本記憶體上限,需 > post_max_size |
Discuz 後台對應設定
- 全局 → 上傳附件設置:最大附件大小(Byte)設為
52428800 (50MB)。
- 版塊權限 → 允許上傳附件:勾選相關用戶組。
- 附件類型管理:新增允許副檔名(zip、rar、pdf 等),設置圖示。
- 圖片附件縮略圖:啟用 GD/ImageMagick 自動生成。
大檔上傳進階調優(>50MB)
# php.ini 額外參數
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 200M
upload_max_filesize = 150M
# Apache mod_security / mod_reqtimeout 可能攔截大請求,需調整或關閉
# Nginx 需同步設定
client_max_body_size 200m;
client_body_timeout 600s;
proxy_read_timeout 600s;
Linux 系統層面檢查
/etc/httpd/conf.d/php.conf 或 apache2.conf 中是否有 LimitRequestBody 限制。
- 檔案系統
ulimit -n 開啟檔案描述符數、磁碟配額。
- 網路帶寬:上傳 100MB 需 8Mbps 以上專線才能在合理時間完成。
常見故障排查
| 現象 | 可能原因 | 排查指令 |
| 上傳即時失敗,無錯誤日誌 | post_max_size 過小 | php -i | grep post_max_size |
| 上傳到 90% 斷開 | max_execution_time / max_input_time 不足 | tail -f /var/log/php-fpm/error.log |
| 移動檔案失敗 (move_uploaded_file false) | upload_tmp_dir 與目標目錄跨分區、權限不足 | ls -ld /data/tmp/upload /var/www/html/attachments |
| Discuz 後台顯示「附件上傳失敗」 | 後台最大附件大小未同步修改 | 檢查 pre_common_setting 表 attachmaxsize |