6

私のlaravel4アプリケーションの一部として小さな画像ジェネレーターがあります。画像を生成するのに約 700 ミリ秒かかるため、生成された結果をサーバーにキャッシュし、代わりにそれをブラウザーに返すことで時間を節約しました。

生成された画像は決して変更されないため、ブラウザに画像をローカルにキャッシュするように指示したかったので、次のコードでこれを行いました。

$path = $cacheFolderPath . $cacheFileName;

if (File::exists( $path )){
    $response = Response::make(File::get($path));
    $response->header('Content-Type', 'image/png');
    $response->header('Content-Disposition', 'inline; filename="'.$cacheFileName.'"');
    $response->header('Content-Transfer-Encoding', 'binary');
    $response->header('Cache-Control', 'public, max-age=10800, pre-check=10800');
    $response->header('Pragma', 'public');
    $response->header('Expires', date(DATE_RFC822,strtotime(" 2 day")) );
    $response->header('Last-Modified', date(DATE_RFC822, File::lastModified($path)) );
    $response->header('Content-Length', filesize($path));
    return $response;
}

これにより、ステータス コードを含む画像が200 OK次のヘッダーとともにブラウザに送信されます。

Cache-Control:max-age=10800, pre-check=10800, public
Connection:Keep-Alive
Content-Disposition:inline; filename="pie_0_normal.png"
Content-Length:2129
Content-Transfer-Encoding:binary
Content-Type:image/png
Date:Wed, 07 Aug 2013 10:29:20 GMT
Expires:Fri, 09 Aug 13 10:29:20 +0000
Keep-Alive:timeout=5, max=93
Last-Modified:Wed, 07 Aug 13 10:14:42 +0000
Pragma:public
Server:Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
Set-Cookie:laravel_session=767487mhf6j2btv3k01vu56174; expires=Wed, 07-Aug-2013 12:29:20 GMT; path=/; httponly
X-Powered-By:PHP/5.4.7

私の問題は、私のブラウザー (Chrome、他ではテストされていません) がまだローカルにキャッシュされたバージョンを単に取得することを拒否し、代わりにサーバーに再度アクセスすることです。

この件に関する他の質問を探すのに約30分を費やしましたが、すべての質問に答えがあり、上記のコードに組み込みました。同様の質問があることは知っていますが、これは上記のソース コードに固有のものです。

私の質問は、ブラウザによってファイルがキャッシュされない原因となる間違ったことは何ですか?

4

2 に答える 2

4

これに代わる方法は、「If-Modified-Since」リクエスト ヘッダーを確認することです。これは、ブラウザーに既にファイルがある場合にのみ存在するためです。

存在する場合は、ファイルが既に作成されていることがわかり、そのファイルへのリンクで応答できます。それ以外の場合は、上記のコードを実行します。このようなもの...

// check if the client validating cache and if it is current
if ( isset( $headers['If-Modified-Since'] ) && ( strtotime( $headers['If-Modified-Since'] ) == filemtime( $image->get_full_path() ) ) ) {

    // cache IS current, respond 304
    header( 'Last-Modified: ' . $image->get_last_modified(), true, 304 );

} else {

    // not cached or client cache is older than server, respond 200 and output

    header( 'Last-Modified: ' . $image->get_last_modified(), true, 200 );
    header( 'Content-Length: ' . $image->get_filesize() );
    header( 'Cache-Control: max-age=' . $image->get_expires() );
    header( 'Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + $image->get_expires() ) );
    header( 'Content-Type: image/jpeg');

    print file_get_contents( $image->get_full_path() ); 
}
于 2013-08-10T16:07:54.743 に答える