1

次のスクリプトは次のようになります。

  1. ファイルのクライアント キャッシュ バージョンが最新の場合、304 Not Modified ヘッダーを返します。
  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
    }
}
?>
4

1 に答える 1

1

以下のコードでは、ステートメントのheader();前に呼び出しを含めます。include($cachefile)

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))." */";
}
于 2013-06-05T12:09:31.337 に答える