如果文件已更改,如何在PHP中创建ZIP?

时间:2012-06-21 17:15:48

标签: php caching ziparchive

我在培训网站上有一个页面,显示了几个从数据库中提取ID的下载。在底部,我已经成功编码将所有这些文件压缩成一个zip供下载。

但是,每次加载页面时,都会重新创建zip并覆盖以前的zip文件。可以想象,这会导致一些加载时间不尽如人意。

我想知道如何进行PHP检查以查看自上次加载页面以来是否有任何文件发生了变化(最后一个视图打开了页面),如果是,则重新创建zip并覆盖。

浏览PHP文档时,似乎filemtime()可能与它有关,但我没有相关经验,甚至不确定我是否可以在网站上使用它。进一步研究,我担心我可能需要涉及缓存,我也没有经验。

任何帮助,建议或线索都会非常有帮助。如果我能更有意义或提供我现有的任何代码作为背景,请告诉我。

2 个答案:

答案 0 :(得分:0)

出于索引目的,我在这里留下答案。

您可以将filename设置为上次更改文件时返回的timestamp日期的最后filemtime(),从而可以将当前timestampfilename本身。它可能会强制您将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/