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

PHP 批量刪除目錄下 N 分鐘前建立的檔案

     編輯:PHP 相關知識

需求場景

專案常需定期清理暫存、日誌或上傳目錄中過期的檔案(如超過 30 分鐘未處理的臨時圖片)。手動刪除不可行,需一個可排程執行的 PHP 腳本。

核心實作

/**
 * 刪除指定目錄下建立時間超過 $minutes 分鐘的檔案
 * @param string $dir 目標目錄絕對路徑
 * @param int $minutes 分鐘閾值
 * @return int 刪除的檔案數
 */
function deleteOldFiles(string $dir, int $minutes = 30): int {
    if (!is_dir($dir)) {
        throw new InvalidArgumentException("目錄不存在: $dir");
    }

    $deleted = 0;
    $cutoff = time() - ($minutes * 60);
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $file) {
        if ($file->isFile() && $file->getCTime() < $cutoff) {
            @unlink($file->getPathname()) && $deleted++;
        }
    }
    return $deleted;
}

// 使用範例:刪除 /var/www/temp 下 60 分鐘前的檔案
echo "已刪除 " . deleteOldFiles('/var/www/temp', 60) . " 個檔案";

關鍵點解析

  • RecursiveDirectoryIterator:遞迴遍歷子目錄,SKIP_DOTS 自動跳過 . 和 ..
  • getCTime():取得檔案 inode 變更時間(建立時間在 Linux 上通常等同 ctime),比 filemtime 更適合「建立時間」判斷
  • 錯誤抑制 @unlink:避免權限不足等情況中斷腳本,配合回傳值統計成功數
  • 型別宣告與嚴格模式:提升代碼健壯性與可維護性

部署建議

  1. 將腳本存放於非公開目錄(如 /usr/local/bin/cleanup_temp.php)
  2. 使用 crontab -e 設定定時任務:
    */15 * * * * /usr/bin/php /usr/local/bin/cleanup_temp.php >> /var/log/cleanup.log 2>&1
    每 15 分鐘執行一次並記錄日誌
  3. 生產環境建議加入鎖機制(如 flock)防止重疊執行

進階擴展

  • 支援依副檔名過濾($file->getExtension() === 'tmp')
  • 加入「乾跑模式」只列印不刪除,方便上線前驗證
  • 整合 Monolog 記錄結構化日誌,便於 ELK 分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved