首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP $_FILES 暫存檔案生命週期與回收機制實測解析

     編輯:PHP 相關知識

許多開發者誤以為上傳的暫存檔案($_FILES['file']['tmp_name'])會在伺服器暫存目錄持久存在,實則 PHP 採用「請求結束即回收」機制。本文透過實測驗證暫存檔案的建立、可見時間窗與自動清除行為。

核心結論

  • 暫存檔案命名規則: phpXXXXXX.tmp 格式(隨機字元)
  • 建立時機: 檔案上傳完成後才在暫存目錄出現(大檔上傳過程中不可見)
  • 生命週期: 當前請求(PHP 進程)結束時自動刪除
  • 異常中斷: 若請求非正常終止(如瀏覽器重整中斷),暫存檔可能殘留

實測過程與觀察

  1. 上傳超大檔案: 上傳過程中暫存目錄無檔案出現,直到 PHP 返回「超過上傳限制」錯誤
  2. 上傳小檔案並列印路徑: 確認命名格式為 php**.tmp
  3. 使用 while 延長進程: 人為卡住 PHP 進程,暫存檔案可在暫存目錄中被觀察到
  4. 正常請求結束: 暫存檔案自動消失
  5. 非正常中斷(重整/關閉瀏覽器): 暫存檔案永久殘留於暫存目錄

機制推測

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() 是跨請求使用上傳檔案的唯一正規路徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved