如何修改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);
关键修改说明:
- 拆分
$file变量为$file(纯文件名)和$full_path(完整路径),避免路径和文件名混淆 - 用
basename($full_path)提取纯文件名,确保判断逻辑针对文件名本身 - 用
substr($filename, -7) === '.sql.gz'直接匹配完整后缀,规避pathinfo只取最后一个后缀的问题 - 增加跳过
.和..的判断,减少无效逻辑
修改后,index.php因为既不符合文件名开头规则,也不符合后缀规则,会被直接跳过;符合条件的备份文件会被正常清理。
内容的提问来源于stack exchange,提问作者Medenor
相关产品推荐
相关产品推荐

