HOWTO · PHP
PHP 中的最大上傳大小
今天的帖子將介紹 PHP 中的最大上傳大小。
本頁內容
若要接受較大的上傳檔案,請提高 PHP 的單檔大小限制 upload_max_filesize,並將 post_max_size 設得足以容納整個請求。首先找出處理上傳的 PHP 程序所使用的設定,再於該處套用設定,並透過同一個程序確認結果。設定檔位置和重新載入方式取決於 PHP 的安裝與託管環境。
找出目前生效的 PHP 設定
PHP 可以從 php.ini 載入設定;命令列 PHP 使用的檔案可能與網頁伺服器或 PHP-FPM 使用的不同。請檢查接收上傳的 PHP 程序所使用的設定。命令列 PHP 可用 php --ini 查出載入的設定檔。若要檢查網頁請求,可用暫存指令碼呼叫 php_ini_loaded_file(),確認實際載入的檔案;檢查完後請移除該指令碼,避免設定資訊持續對外公開。
php.ini 通常存放 PHP 安裝或執行環境的設定。有些網頁伺服器也允許透過 .htaccess 設定目錄層級的覆寫值,但是否支援取決於伺服器及其 PHP 整合方式。PHP 本身不提供 .htaccess,而主機也可能停用這類覆寫功能。如果你無法管理相關檔案或服務,請使用託管控制面板,或詢問管理員哪些設定可以調整。
設定 upload_max_filesize
這項指令會限制單一上傳檔案的大小。請編輯目前生效的設定,並選擇足以容納預計接受之最大檔案的值。例如,upload_max_filesize = 32M 會將單檔限制設為 32 MB。PHP 的大小值通常使用 K、M 或 G;請選擇 PHP 設定與主機支援的值。不要假設範例值就是目前的預設值,也不要假設修改它會影響伺服器上的所有 PHP 執行環境。
設定 post_max_size 以容納完整請求
post_max_size 限制整個 HTTP 請求本文的大小,其中包括 multipart 表單資料及請求中的其他檔案。請將它設得高於 upload_max_filesize,並預留表單欄位與 multipart 格式的額外負荷。例如,若單檔限制為 32 MB,可將請求限制設為 40M,留出一些餘裕。如果請求限制太小,即使檔案本身未超過 upload_max_filesize,PHP 仍可能無法將上傳檔案提供給應用程式。這兩項設定不必受 memory_limit 限制;記憶體需求取決於應用程式如何處理上傳內容。
套用變更
儲存適用於接收上傳之 PHP 程序的設定檔或覆寫設定。依主機環境而定,變更可能立即生效,也可能需要重新載入或重新啟動網頁伺服器、PHP-FPM 或其他 PHP 服務。請依照託管環境的程序操作;執行新的命令列 PHP 命令不需要重新啟動 PHP,但長時間執行的服務可能需要重新載入。使用共享主機時,可能必須在控制面板變更設定值,而非編輯伺服器檔案。
確認實際生效的限制
請在處理上傳的同一個環境中檢查這兩個值。簡短的 PHP 指令碼可以顯示該程序讀取到的設定:
這個範例內容完整,但本資料包未提供執行驗證。範例中的指令名稱及輸出標籤會以英文顯示。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
foreach (['upload_max_filesize', 'post_max_size'] as $name) {
echo $name, '=', ini_get($name), PHP_EOL;
}
請透過相關的網頁執行環境執行指令碼,以檢查網頁設定;在終端機執行則檢查的是 CLI PHP。完成後請移除暫存的診斷頁面。如果回報的值沒有改變,請確認你修改的是實際載入的設定檔,且已對正確的服務套用變更。
排查仍然失敗的上傳
如果上傳遭到拒絕,請將檔案大小與 upload_max_filesize 比較,並將完整請求大小與 post_max_size 比較。若出現類似「The uploaded file exceeds the upload_max_filesize directive in php.ini」的錯誤,通常表示超過 PHP 的單檔限制,但實際措辭可能不同。如果顯示的限制仍然偏低,請檢查載入的檔案,以及相關服務是否已重新載入。如果 PHP 回報的值符合預期,其他層可能設有更低的限制,例如網頁伺服器、代理伺服器、託管平台或應用程式規則。請檢查該層的設定與記錄;如果限制無法自行設定,請詢問主機服務商。請維持請求限制高於單檔限制,並透過實際處理上傳的相同路徑與 PHP 執行環境重新測試。