You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PHP脚本仅删除7天前指定前缀或.sql.gz备份文件

解决方法

你的修改失效的核心原因有两个:

  • 你用完整文件路径(比如/my/backups/XXX_backup.sql.gz)去匹配文件名开头的XXX,strpos($file, "XXX")只会在路径中找XXX,而非文件名开头,条件永远不成立
  • pathinfo($file, PATHINFO_EXTENSION)只能提取最后一个后缀,sql.gz会返回gz,所以你判断== 'sql.gz'永远为假

以下是修正后的完整脚本,只删除以XXX开头或后缀为.sql.gz且超过7天的文件:

<?php

function delete_older_than($dir, $max_age) {
  $list = array();
  
  $limit = time() - $max_age;
  
  $dir = realpath($dir);
  
  if (!is_dir($dir)) {
    return;
  }
  
  $dh = opendir($dir);
  if ($dh === false) {
    return;
  }
  
  while (($file = readdir($dh)) !== false) {
    $full_path = $dir . '/' . $file;
    // 跳过非文件、当前目录和上级目录
    if (!is_file($full_path) || in_array($file, ['.', '..'])) {
      continue;
    }
    
    // 提取纯文件名,用于规则判断
    $filename = basename($full_path);
    // 判断是否为目标文件:以XXX开头 或 后缀是.sql.gz
    $is_target_file = (strpos($filename, 'XXX') === 0) || (substr($filename, -7) === '.sql.gz');
    
    // 仅当是目标文件且超过7天时执行删除
    if ($is_target_file && filemtime($full_path) < $limit) {
      $list[] = $full_path;
      unlink($full_path);
    }
    
  }
  closedir($dh);
  return $list;

}


// 使用示例
$dir = "/my/backups";
$to = "my@email.com";

// 删除7天前的目标备份文件
$deleted = delete_older_than($dir, 3600*24*7);

$txt = "Deleted " . count($deleted) . " old backup(s):
" .
    implode("
", $deleted);

mail($to, "Backups cleanup", $txt);

关键修改说明:

  1. 拆分$file变量为$file(纯文件名)和$full_path(完整路径),避免路径和文件名混淆
  2. 用basename($full_path)提取纯文件名,确保判断逻辑针对文件名本身
  3. 用substr($filename, -7) === '.sql.gz'直接匹配完整后缀,规避pathinfo只取最后一个后缀的问题
  4. 增加跳过.和..的判断,减少无效逻辑

修改后,index.php因为既不符合文件名开头规则,也不符合后缀规则,会被直接跳过;符合条件的备份文件会被正常清理。

内容的提问来源于stack exchange,提问作者Medenor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:10:15