php - 動的に生成された画像をキャッシュする

php browser-cache

PHPスクリプトを使用して画像を生成しています。
画像をキャッシュしたいので、ブラウザーが毎回それらをロードする必要はありません。
これらのヘッダーを追加しました:

'max-age' => 3600
'Etag' => md5($image->getSlug())
'last-modified' => $image->getUpdatedAt()
'Vary' => 'Accept-Encoding'
'content-length' => (size of the image)
'Content-type' => 'image/jpeg'


ただし、画像はキャッシュされず、ブラウザによって毎回読み込まれます。

応答ヘッダーは次のようになります(Firebugを使用)。

Date             Sun, 04 Sep 2011 00:25:45 GMT
Server           Apache/2.2.16 (Debian)
X-Powered-By     PHP/5.3.3-7+squeeze1
Cache-Control    max-age=3600, private
Etag            "9280c6c672c6535c13b7481972f9ac39"
Last-Modified    Sat, 27 Aug 2011 01:36:24 GMT
Vary             Accept-Encoding
Content-Length   26231
Connection       close
Content-Type     image/jpeg


ここで何が問題になっているのか誰か誰か知っていますか?
答え
画像を強制的にキャッシュする1つの方法は、Last-Modifiedタグを、使用する画像が作成された日時に設定することです。例えば:

<?php
error_reporting(0); //disable error reporting as it will corrupt the image
session_start(); //start a php session
$date = date(DATE_RFC822);
//some code to connect to a mysql database
$query = mysqli_query($link, "SELECT * FROM images WHERE sessionid='$sessionid'");
if ($query and mysqli_num_rows($query) == 1) { //if mysql returned one row
    $row = mysqli_fetch_array($query); //get the row as an array
    $date = $row["date"]; //set the date to the one in the database
} else { //if the user has never seen the image before
    mysqli_query($link, "INSERT INTO images SET sessionid='$sessionid', date='$date'"); //put the session id and date into the database for later use
}
header("Last-Modified: $date");
//some code that would generate and send the image


(任意のデータベースプログラムで)imagesと呼ばれるテーブルを含むデータベースを作成することを忘れないでください。これには、主キーであるsessioniddateが必要です。どちらも文字列でなければなりません。
関連記事

php - Graph APIを使用して投稿の「タイプ」フィールドを取得する

php - アプリケーションまたはデータベースのタイムスタンプ列を更新しますか?

php - Regexを介してアンダースコアと共にUnicode文字を受け入れる

php - サーバーのパブリックフォルダーに送られるすべてのリクエストを処理する1つのPHPファイルを作成することは可能ですか?

php - PHPの型ヒントが、私のクラスを文字列であると考えるのはなぜですか?

php - mysql_connect()からの警告がmysql_error()を生成しない

php - PHP多対多セットID

php - SELECTとJOINステートメントのIDに自分のIDを含めるにはどうすればよいですか?

php - mysql_real_escape_string($ username)次にcookieとして保存し、ログインの確認に使用

php - preg_replaceには式のヘルプが必要です