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

如何用PHP读取Zip文件创建日期并实现24小时自动清理

实现可生成并自动清理的Zip下载功能

咱们分两部分来落地你的需求:生成Zip包并提供下载按钮,以及自动清理24小时以上的旧Zip文件,全程不用数据库追踪,纯靠文件系统操作就能搞定。

一、生成Zip包并提供下载

用PHP内置的ZipArchive类就能轻松实现多文件/目录打包,下面是可直接整合进业务的示例代码:

<?php
// 设置Zip文件存储目录(务必确保这个目录有读写权限)
$zipStorageDir = __DIR__ . '/generated_zips/';
// 自动创建存储目录(如果不存在)
if (!is_dir($zipStorageDir)) {
    mkdir($zipStorageDir, 0755, true);
}

// 生成唯一Zip文件名(时间戳+随机串避免重复)
$zipFileName = 'archive_' . time() . '_' . uniqid() . '.zip';
$zipFilePath = $zipStorageDir . $zipFileName;

// 初始化ZipArchive实例
$zip = new ZipArchive();
if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) {
    // 示例1:添加单个文件到Zip
    $targetFile = __DIR__ . '/documents/annual_report.pdf';
    if (file_exists($targetFile)) {
        // 第二个参数是Zip内部的文件路径/名称,可自定义
        $zip->addFile($targetFile, 'reports/annual_report.pdf');
    }

    // 示例2:递归添加整个目录(包含子文件/子目录)
    $targetDir = __DIR__ . '/product_images/';
    $addDirToZip = function($dir, $zip, $baseZipPath = '') use (&$addDirToZip) {
        $files = scandir($dir);
        foreach ($files as $file) {
            if ($file == '.' || $file == '..') continue;
            $fullFilePath = $dir . '/' . $file;
            $zipInnerPath = $baseZipPath . '/' . $file;
            
            if (is_dir($fullFilePath)) {
                $zip->addEmptyDir($zipInnerPath);
                $addDirToZip($fullFilePath, $zip, $zipInnerPath);
            } else {
                $zip->addFile($fullFilePath, $zipInnerPath);
            }
        }
    };
    $addDirToZip($targetDir, $zip, 'product_images');

    // 关闭Zip文件
    $zip->close();

    // 输出前端下载按钮
    echo '<a href="download_zip.php?file=' . urlencode($zipFileName) . '" class="btn btn-primary">下载Zip包</a>';
} else {
    echo '生成Zip包失败,请检查存储目录权限';
}
?>

配套的download_zip.php处理下载请求:

<?php
$zipStorageDir = __DIR__ . '/generated_zips/';
$requestedFile = urldecode($_GET['file']);
$fullFilePath = $zipStorageDir . $requestedFile;

// 安全验证:确保文件存在且是合法Zip
if (file_exists($fullFilePath) && pathinfo($fullFilePath, PATHINFO_EXTENSION) === 'zip') {
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . basename($fullFilePath) . '"');
    header('Content-Length: ' . filesize($fullFilePath));
    readfile($fullFilePath);
} else {
    echo '文件不存在或无效';
}
?>

二、自动清理24小时以上的旧Zip文件

核心逻辑是每次用户触发下载相关操作时(比如加载生成页面、点击下载按钮),自动遍历存储目录,检查文件创建时间并删除过期文件,不用依赖服务器定时任务,纯PHP实现。

把这段清理代码放在生成Zip的页面开头,或者download_zip.php的开头即可:

<?php
$zipStorageDir = __DIR__ . '/generated_zips/';
$expirySeconds = 24 * 60 * 60; // 24小时换算成秒

if (is_dir($zipStorageDir)) {
    $files = scandir($zipStorageDir);
    foreach ($files as $file) {
        if ($file == '.' || $file == '..') continue;
        $fullFilePath = $zipStorageDir . $file;
        
        // 只处理Zip文件
        if (pathinfo($fullFilePath, PATHINFO_EXTENSION) !== 'zip') continue;

        // 兼容Windows和Unix系统的文件创建时间获取
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // Windows下filemtime返回创建时间,filectime是修改时间
            $fileCreateTime = filemtime($fullFilePath);
        } else {
            // Unix/Linux下filectime返回创建时间
            $fileCreateTime = filectime($fullFilePath);
        }

        // 判断是否超过24小时
        if (time() - $fileCreateTime > $expirySeconds) {
            // 删除文件(注意权限)
            if (unlink($fullFilePath)) {
                // 可选:记录清理日志
                error_log('已清理过期Zip文件:' . $fullFilePath);
            } else {
                error_log('清理失败:' . $fullFilePath . ',权限不足');
            }
        }
    }
}
?>

三、关键注意事项

  • 目录权限:generated_zips目录权限建议设为0755或0775,避免用0777(安全风险),否则无法生成或删除文件。
  • 安全防护:在download_zip.php中可进一步加强验证,比如用realpath()确认请求的文件确实在存储目录内,防止路径遍历攻击。
  • 跨系统兼容:代码已经处理了Windows和Unix系统的文件时间差异,无需额外调整。
  • 日志记录:添加错误日志方便排查生成或清理失败的问题,服务器默认会记录到PHP错误日志中。

这样整个流程就闭环了:用户请求生成Zip → 系统生成并提供下载链接 → 每次请求时自动清理过期文件,完全不需要数据库参与。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:17:14