
在许多web应用中,缓存目录(如cache/)通常会存储大量临时文件,这些文件可能以特定的命名模式存在,例如sifriugh-80.json、dlifjbhvzique-76.json等,通常包含一个基础名称和动态生成的数字后缀。为了有效管理这些缓存文件,我们经常需要定期清理过期文件。
然而,实际需求往往更为复杂。例如,我们可能需要对某些特定后缀的文件(如以-100.json结尾的文件)采取不同的清理策略,例如将其保留更长时间(如7天),而其他常规文件则在较短时间(如2小时)后删除。传统的清理脚本可能只简单地根据文件创建时间进行统一删除,无法满足这种精细化的管理需求。如果尝试使用正则表达式来判断文件名后缀,可能会导致代码复杂且不易阅读,尤其对于简单的后缀匹配而言。
从PHP 8.0版本开始,PHP引入了一个非常实用的字符串函数str_ends_with(),用于判断一个字符串是否以另一个字符串结尾。这个函数简洁、高效且易于理解,是解决上述文件后缀判断问题的理想选择。
函数签名:
str_ends_with(string $haystack, string $needle): bool
其中:
立即学习“PHP免费学习笔记(深入)”;
示例代码:基本用法
以下是如何在文件清理逻辑中利用str_ends_with()进行条件判断的示例:
<?php
$filename1 = 'sifriugh-80.json';
$filename2 = 'dfhgzeiuy-100.json';
if (str_ends_with($filename1, '-100.json')) {
echo "{$filename1} 以 '-100.json' 结尾,执行特殊清理逻辑。\n";
} else {
echo "{$filename1} 不以 '-100.json' 结尾,执行常规清理逻辑。\n";
}
// 输出: sifriugh-80.json 不以 '-100.json' 结尾,执行常规清理逻辑。
if (str_ends_with($filename2, '-100.json')) {
echo "{$filename2} 以 '-100.json' 结尾,执行特殊清理逻辑。\n";
} else {
echo "{$filename2} 不以 '-100.json' 结尾,执行常规清理逻辑。\n";
}
// 输出: dfhgzeiuy-100.json 以 '-100.json' 结尾,执行特殊清理逻辑。
?>如果您的项目运行在PHP 7或更早版本,str_ends_with()函数将不可用。不过,我们可以通过自定义函数来模拟其功能。一种常见且高效的方法是使用substr()函数结合字符串长度判断:
<?php
// 为 PHP 7 及更早版本模拟 str_ends_with() 函数
if (!function_exists('str_ends_with')) {
function str_ends_with(string $haystack, string $needle): bool
{
if ($needle === '') {
return true; // 空字符串被认为是任何字符串的结尾
}
$len = strlen($needle);
return substr($haystack, -$len) === $needle;
}
}
// 现在可以在 PHP 7 环境中使用 str_ends_with() 函数
$filename = 'example-100.json';
if (str_ends_with($filename, '-100.json')) {
echo "文件 {$filename} 满足条件。\n";
} else {
echo "文件 {$filename} 不满足条件。\n";
}
?>这个模拟函数首先检查 $needle 是否为空字符串,因为空字符串在逻辑上被认为是任何字符串的结尾。然后,它通过获取 $needle 的长度,并使用 substr($haystack, -$len) 从 $haystack 的末尾提取相同长度的子字符串进行比较。
现在,我们将上述的文件后缀判断逻辑整合到一个完整的缓存清理脚本中,以实现差异化的文件删除策略。
<?php
// 为 PHP 7 及更早版本模拟 str_ends_with() 函数
if (!function_exists('str_ends_with')) {
function str_ends_with(string $haystack, string $needle): bool
{
if ($needle === '') {
return true;
}
$len = strlen($needle);
return substr($haystack, -$len) === $needle;
}
}
$cacheDir = 'cache'; // 缓存目录路径
// 确保缓存目录存在且可读写
if (!is_dir($cacheDir) || !is_readable($cacheDir)) {
die("错误:缓存目录 '{$cacheDir}' 不存在或不可读。\n");
}
$fileSystemIterator = new FilesystemIterator($cacheDir);
$now = time();
// 定义清理周期(秒)
$regularDeletionThreshold = 2 * 3600; // 2小时
$specialDeletionThreshold = 7 * 24 * 3600; // 7天
echo "开始清理缓存目录 '{$cacheDir}'...\n";
foreach ($fileSystemIterator as $file) {
// 检查文件是否为实际文件,排除目录等
if (!$file->isFile()) {
continue;
}
$filename = $file->getFilename();
$filePath = $file->getPathname(); // 获取文件的完整路径
$fileCreationTime = $file->getCTime(); // 获取文件创建时间 (Change Time)
// 计算文件已存在的时间(秒)
$age = $now - $fileCreationTime;
// 判断文件是否为特殊文件(以 '-100.json' 结尾)
$isSpecialFile = str_ends_with($filename, '-100.json');
if ($isSpecialFile) {
// 对于以 '-100.json' 结尾的特殊文件,如果超过7天则删除
if ($age >= $specialDeletionThreshold) {
echo " [删除] 特殊文件: {$filename} (创建于 " . date('Y-m-d H:i:s', $fileCreationTime) . ", 已存在 {$age}s)\n";
if (!unlink($filePath)) {
error_log("无法删除文件: {$filePath}");
echo " -> 警告:删除失败!\n";
}
} else {
echo " [保留] 特殊文件: {$filename} (创建于 " . date('Y-m-d H:i:s', $fileCreationTime) . ", 已存在 {$age}s, 未达7天删除阈值)\n";
}
} else {
// 对于其他常规文件,如果超过2小时则删除
if ($age >= $regularDeletionThreshold) {
echo " [删除] 常规文件: {$filename} (创建于 " . date('Y-m-d H:i:s', $fileCreationTime) . ", 已存在 {$age}s)\n";
if (!unlink($filePath)) {
error_log("无法删除文件: {$filePath}");
echo " -> 警告:删除失败!\n";
}
} else {
echo " [保留] 常规文件: {$filename} (创建于 " . date('Y-m-d H:i:s', $fileCreationTime) . ", 已存在 {$age}s, 未达2小时删除阈值)\n";
}
}
}
echo "缓存清理完成。\n";
?>如何运行此脚本:
通过利用PHP 8+的str_ends_with()函数(或其PHP 7兼容模拟),我们可以轻松地在文件清理脚本中实现基于文件名后缀的差异化处理逻辑。这种方法不仅提高了代码的可读性和维护性,而且相比复杂的正则表达式,对于简单的后缀判断更为高效。结合文件系统迭代和时间判断,您可以构建出功能强大且灵活的缓存文件管理系统,以满足各种复杂的清理需求。
以上就是PHP文件清理策略:使用str_ends_with实现基于文件后缀的条件删除的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号