PHP实现每5分钟自动删除cache目录所有文件的方法咨询
解决每5分钟自动清理缓存文件夹需求的方案
嘿,我看到你已经写了生成缓存文件的gd_cache函数,现在需要定期清空cache目录下的所有文件对吧?这就给你安排两种实用的实现方式:
方法一:PHP脚本 + 服务器定时任务(首推)
这种方式最稳定,因为依赖服务器的定时调度(比如Linux的Cron),不依赖网页访问,到点就自动执行清理。
1. 写一个专门的缓存清理脚本(比如命名为clean_cache.php)
<?php // 定义缓存目录的绝对路径,避免路径问题 $cacheDir = __DIR__ . '/cache/'; // 先检查缓存目录是否存在 if (!is_dir($cacheDir)) { exit("缓存目录不存在,无需清理\n"); } // 获取目录下所有文件 $files = glob($cacheDir . '*'); foreach ($files as $file) { // 只删除文件,保留可能存在的子目录(如果有的话) if (is_file($file)) { unlink($file); // 可选:记录清理日志 // error_log("清理缓存文件:" . basename($file)); } } echo "缓存清理完成\n"; ?>
2. 设置服务器定时任务
如果是Linux服务器,打开终端输入crontab -e,添加下面这一行:
*/5 * * * * php /绝对路径/到/你的/clean_cache.php
这里的*/5 * * * *表示每5分钟执行一次,记得把路径替换成你实际存放clean_cache.php的绝对路径哦。
方法二:在缓存函数中嵌入自动清理逻辑(适合无服务器权限场景)
如果你没法设置服务器的定时任务,可以把清理逻辑加到你的gd_cache函数里,每次有用户访问触发这个函数时,就检查是否到了清理时间:
修改后的gd_cache函数:
function gd_cache($link, $source) { // 第一步:检查是否需要清理缓存(每5分钟=300秒) $lastCleanFile = __DIR__ . '/cache/last_clean_timestamp.txt'; $now = time(); // 要么没有清理标记文件,要么距离上次清理已经超过5分钟,就执行清理 if (!file_exists($lastCleanFile) || ($now - file_get_contents($lastCleanFile)) > 300) { $cacheDir = __DIR__ . '/cache/'; $files = glob($cacheDir . '*'); foreach ($files as $file) { // 跳过清理标记文件,只删其他缓存文件 if (is_file($file) && basename($file) !== 'last_clean_timestamp.txt') { unlink($file); } } // 更新上次清理的时间戳 file_put_contents($lastCleanFile, $now); } // 原有的缓存生成逻辑 $time = gmdate('Y-m-d H:i:s', time() + 3600*(+7+date('I'))); $file_name = md5('AA'.$link.'A3Code'); $string = strtotime($time).'@@'.$source; $file = fopen("cache/".$file_name.".cache",'w'); fwrite($file,$string); fclose($file); // 原函数里的if判断其实没起到作用,不管文件是否创建成功都返回$source,可以简化 return $source; }
⚠️ 注意:第二种方法的局限性是,如果长时间没有用户访问你的网站,缓存就不会被清理,所以如果能设置服务器定时任务,优先选第一种方法。
另外提个小建议:原函数里的if(file_exists(...))判断完全可以去掉,因为不管文件是否创建成功你都返回$source,如果想更严谨的话,可以加个文件写入失败的处理,比如记录错误日志之类的。
内容的提问来源于stack exchange,提问作者user9081669




