2013-06-05 126 views
1

發送標題下面的腳本將:與服務器緩存文件

  1. 返回一個304未修改頭,如果該文件的客戶端緩存的版本是最新的。
  2. 如果不是,那麼它將返回該文件的服務器緩存版本(如果它是最新的)。
  3. 如果不是,它將創建文件,在服務器端緩存中存儲副本,然後返回文件。

我的問題是第2步:返回一個服務器緩存的文件版本。正如我在創建原始文件的位置所看到的,我還會發送一些標題來指示返回的文件的類型,並允許客戶端緩存文件。如何在返回文件的服務器緩存版本時發送相同的頭文件?

偏離主題,不涉及這個問題,但任何評論我如何命名緩存的文件將不勝感激。 $cachefile = $root.'/ayb_cache/'.preg_replace("/[^A-Za-z0-9 ]/", '', basename($_SERVER['REQUEST_URI']));

<?php 
date_default_timezone_set('UTC'); 
$root=dirname(dirname(dirname(dirname(__FILE__)))); 
$filetime=filemtime(__FILE__); 
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $filetime)) 
{ 
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $filetime).' GMT', true, 304); 
} 
else 
{ 
    //Not yet cached on client 

    $cachefile = $root.'/ayb_cache/'.preg_replace("/[^A-Za-z0-9 ]/", '', basename($_SERVER['REQUEST_URI'])); 
    $cachetime=60*60*24*14; 

    if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) 
    { 
     // Serve from the cache if it is younger than $cachetime 
     include($cachefile); 
     //echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->"; 
     echo "/* Cached ".date('jS F Y H:i', filemtime($cachefile))." */"; 
    } 

    else 
    { 
     //create new file 
     ob_start(); 

     header('Content-type: text/javascript'); //tell the browser we're returning JS 
     header('Pragma: public'); 
     header('Cache-Control: public, maxage='.$cachetime); 
     header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$cachetime) . ' GMT'); 
     header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime(__FILE__)).' GMT', true, 200); 

     echo('alert("My Javascript");'); 

     $fp = fopen($cachefile, 'w'); // open the cache file for writing 
     fwrite($fp, ob_get_contents()); // save the contents of output buffer to the file 
     fclose($fp); 
     ob_end_flush(); // Send the output to the browser 
    } 
} 
?> 

回答

1

在下面的代碼包括include($cachefile)語句之前header();電話。

if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) 
{ 
    // Serve from the cache if it is younger than $cachetime 
    include($cachefile); 
    //echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->"; 
    echo "/* Cached ".date('jS F Y H:i', filemtime($cachefile))." */"; 
} 
+0

哈哈,Eactly。我覺得很愚蠢。需要等待9分鐘才能選擇這個答案。有關我如何命名緩存文件的任何想法? – user1032531

+0

一些建議可能是'cache.key.js',密鑰是(user_id,timestamp)@ user1032531 – DevZer0