如何用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
相关产品推荐
相关产品推荐

