許多開發者誤以為上傳的暫存檔案($_FILES['file']['tmp_name'])會在伺服器暫存目錄持久存在,實則 PHP 採用「請求結束即回收」機制。本文透過實測驗證暫存檔案的建立、可見時間窗與自動清除行為。
phpXXXXXX.tmp 格式(隨機字元)php**.tmpwhile 延長進程: 人為卡住 PHP 進程,暫存檔案可在暫存目錄中被觀察到PHP 在請求啟動時註冊請求結束回調(RSHUTDOWN),於 php_request_shutdown 階段遍歷並清理當前請求建立的所有暫存檔。此機制獨立於 include 巢狀深度,僅綁定於 SAPI 請求週期。
<?php
// 第一輪請求:上傳並立即移動到永久儲存位置
if (move_uploaded_file($_FILES['file']['tmp_name'], $permanentPath)) {
// 儲存 $permanentPath 至資料庫/Session/快取
// 回傳永久路徑或檔案 ID 給前端
}
// 第二輪請求:直接操作永久路徑
// resize、轉檔、OCR 等後續處理
$image = imagecreatefromjpeg($permanentPath);
// ...
// ❌ 錯誤:嘗試在第二輪請求直接使用 tmp_name // 第一輪 echo $_FILES['file']['tmp_name']; // 回傳給前端 // 第二輪(檔案已被自動刪除,操作失敗) $img = imagecreatefromjpeg($_POST['tmp_path']); // Warning: failed to open stream
upload_tmp_dir:自訂暫存目錄(預設系統暫存目錄)upload_max_filesize、post_max_size:超過限制時 PHP 直接拒絕,暫存檔不會建立max_execution_time:上傳過程計入執行時間,大檔需調大理解暫存檔案「請求級」生命週期,是正確處理分步上傳、大檔斷點續傳、非同步圖片處理等業務的前提。永遠記住:move_uploaded_file() 是跨請求使用上傳檔案的唯一正規路徑。