You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动