0

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

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

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

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

任何帮助、建议或线索都会非常有帮助。让我知道我是否可以更有意义或提供我现有的任何代码作为背景。

4

2 回答 2

0

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

您可以将 设置filename为等于最后一次更改文件时timestamp返回的filemtime()日期,从而能够将当前日期timestampfilename自身进行比较。它可能会迫使您将zip文件夹结构分解为更复杂的东西以避免冲突,但是您也可以再次制作filename

$timestamp = time();
$id = uniqid();
echo "Filename : {$timestamp}-{$id}.zip";
于 2012-06-21T18:16:34.580 回答
0

我确信 Yoda 提供的解决方案会奏效,但我选择了(我认为)更简单的解决方案。

出于我的目的,我需要随着时间的推移保持 zip 文件名不变(无法将时间戳放在文件名中)。相反,我使用 filemtime() 从文件中收集了最新的时间戳。然后我将它们与我的 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 / )

于 2012-07-03T16:52:53.753 回答