我在培训网站上有一个页面,显示了几个从数据库中提取ID的下载。在底部,我已经成功编码将所有这些文件压缩成一个zip供下载。
但是,每次加载页面时,都会重新创建zip并覆盖以前的zip文件。可以想象,这会导致一些加载时间不尽如人意。
我想知道如何进行PHP检查以查看自上次加载页面以来是否有任何文件发生了变化(最后一个视图打开了页面),如果是,则重新创建zip并覆盖。
浏览PHP文档时,似乎filemtime()
可能与它有关,但我没有相关经验,甚至不确定我是否可以在网站上使用它。进一步研究,我担心我可能需要涉及缓存,我也没有经验。
任何帮助,建议或线索都会非常有帮助。如果我能更有意义或提供我现有的任何代码作为背景,请告诉我。
答案 0 :(得分:0)
出于索引目的,我在这里留下答案。
您可以将filename
设置为上次更改文件时返回的timestamp
日期的最后filemtime()
,从而可以将当前timestamp
与filename
本身。它可能会强制您将zip
文件夹结构分解为更复杂的内容以避免冒号,但是您可以再次使filename
类似于:
$timestamp = time();
$id = uniqid();
echo "Filename : {$timestamp}-{$id}.zip";
答案 1 :(得分:0)
我确信尤达提供的解决方案可行,但我认为(我认为)这是一个更简单的解决方案。
出于我的目的,我需要保持zip文件名随时间不变(无法将时间戳放在文件名中)。相反,我使用filemtime()从文件中收集了最新的时间戳。然后我将它们与我的zip文件的时间戳进行比较。如果拉链时间不太近,拉链不存在,或者列表中的文件数与zip中的数字不匹配,我重新创建了拉链,否则,我只是显示了拉链。
我的情况有点独特,因为我通过wordpress插件(下载监视器)存储和显示可下载文件。这基本上就是我做的事情:
/*Functions*/
//Convert url to absolute path
function url2path($url){
$parsed = parse_url($url);
if(!is_array($parsed)) return false;
$path = $_SERVER['DOCUMENT_ROOT'].$parsed['path'];
return $path;
}
//Returns the highest number (works with Unix Timestamps)
function get_highest_number($numbers){
if(!is_array($numbers)) return false;
$highest = $numbers[0];
foreach($numbers as $number) if($highest < $number) $highest = $number;
return $highest;
}
$dtimes = array();
foreach($dl as $d) { //iterate through my array of downloads
$dtimes[] = filemtime(url2path($d->filename));
//$dtimes is an array containing all the unix timestamps of my downloads
//other code to display individual downloads, etc
}
//Zip Details
$uploads = wp_upload_dir();
$parent = get_page($post->post_parent);
$zip_url = $uploads[baseurl].'/downloads/zips/'.$parent->post_name.'_'.$post->post_name.'.zip';
if($dtimes){
$latesttime = get_highest_number($dtimes); //latest UNIX timestamp of files
//If ZIP already exists, get timestamp of when ZIP was created
//I create the ZIP file name from the page title and store them all in 1 directory, thus, I would have to know the full zip filename to retrieve it.
if($ziptime = filemtime(url2path($zip_url))){
$zip = new ZipArchive();
$zip->open(url2path($zip_url));
//If ZIP timestamp is more recent than file, show ZIP
if($ziptime > $latesttime && $zip->numFiles == count($dtimes)) $result = url2path($zip_url);
else $result = cat has create_zip($downloads,$zip_url,true);
}
//If ZIP doesn't exist or ZIP timestampe is less recent than files, create/rewrite ZIP
else $result = create_zip($downloads,$zip_url,true);
//regardless of what has happened, $result should now hold the path to the zip archive.
}
希望这可以帮助有类似问题的人。如果您对演示感兴趣,“培训库”中的几乎任何页面都会使用此代码(即http://chesapeakestormwater.net/training-library/all-about-stormwater/impervious-cover-and-stream-health/)