人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP+MySQLで、画像が投稿できる掲示板のようなものを製作しています。投稿内容の修正で、画像を再アップした時に、以前の画像がキャッシュに残ってしまい、再読込みしないと、画像が最新の物に変わりません。
キャッシュが残らないようにするには、どうしたら良いでしょうか?

●質問者: ebagos
●カテゴリ:コンピュータ
✍キーワード:MySQL PHP キャッシュ 投稿 掲示板
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ootatmt
●10ポイント

http://tech.bayashi.net/pdmemo/browsercache.html

ブラウザ のキャッシュを制御する/no-cache

HTTPヘッダーで次の出力をしておきます。


Pragma: no-cache

Cache-Control: no-cache

Expires: 0


詳しくはURLのページに書かれています。


2 ● magicshops
●10ポイント

http://pukiwiki.sourceforge.jp/dev/?BugTrack%2F486

BugTrack/486 - PukiWiki-dev

ヘッダーでキャッシュを無効にするという方法が紹介されています。

この方法を試してみてはいかがでしょうか?

◎質問者からの返答

header(”Cache-Control: no-cache, must-revalidate”);

header(”Pragma: no-cache”);

上記を記載して、HTMLはキャッシュされないようになったのですが、画像はキャッシュされてしまいます・・・


3 ● ootatmt
●17ポイント

http://www.hatena.ne.jp/1127867724

人力検索はてな - PHP+MySQLで、画像が投稿できる掲示板のようなものを製作しています。投稿内容の修正で、画像を再アップした時に、以前の画像がキャッシュに残ってしまい、再読込みしない..

画像のURLにランダムな文字を添付してはどうでしょうか。


HTMLはPHPで出力していると思いますが、その際に画像のアドレスにランダムな数字などをつけるようにします。


(例) <img src=”http://www.hatena.ne.jp/images/hatena_blue.gif#123”>


これで、キャッシュが残っても毎回違うアドレスになっていますので、編集後にキャッシュが表示されることはありません。

◎質問者からの返答

URLにランダムな文字を添付してみましたが、キャッシュには、hatena_blue.gif(例)として登録されるようです。


4 ● redcherry
●33ポイント

http://www.apple.com/

Apple

URLはダミーです。


CGIはブラウザに画像へのURLを提示するだけであって、実際の画像ダウンロードはWebサーバとブラウザだけの仕事になります。

もう少し細かいことを言えば、imgタグやそこに挿入可能なJavaScriptで何らかのキャッシュコントロールが出来るとよかったのかもしれませんけれど、現実には(おそらく)その手段は用意されていません。


で、ブラウザ側はサーバに画像(に限りません。ファイル全般)を要求する際に最後の更新時刻とデータのハッシュコードを送信して、その日付よりも新しい、もしくはハッシュコードが異なる場合には画像のデータを送り返し、そうでない場合は「更新されてないよ」という返事を返すだけにとどまります。


サーバに新しいファイルが存在するはずなのにその情報が正しくクライアントに伝わっていないのか、それともクライアントがいい加減な問いかけをサーバにしてしまっているために「更新なし」と返事してしまっているのかは実際にやりとりされているHTTPメッセージを解析して調べてみる必要があると思いますが、大抵はサーバの設定(もしくはバージョン)に問題があるためにサーバがクライアントに正しい情報を返していない場合が多いと思います。

この場合の「サーバ」はWebサーバに限りません。

実はサーバのトラフィックをおさえるために、Webサーバの直前にProxyサーバが設置してある場合もあり、そちらの設定がまずいのかもしれません。


従って、単にPHPやWebサーバ側をどうにかすれば・・・という問題でもないわけです。


余談ですが、仮に画像のキャッシングを無効化する事が可能だったとしても、あんまりいいソリューションじゃないですよね。

更新されていようがいまいが必ず画像のデータが飛び交うわけですから、サーバに優しくありません。


そこで、ちょっとひねった解決策があります。


画像を更新保存する際に、実際のファイル名の末尾に(ただし拡張子の前に)更新毎に新しく発行する文字列を追加する、という方法です。

これは画像URL末尾に#fooなどのラベルを設置する方法では解決しません。

キャッシングの対象は実体URLのみですから、その内部の位置を意味する#fooは効果がないのです。


その解決策の流れはこうです。


ファイル名が hoge.jpg であるならば、初めてサーバにアップロードされた時にはサーバ上での保存名を hoge_0.jpg

この画像が更新保存されたら hoge_1.jpg としてサーバには保存し、かつて保存してあった hoge_0.jpg を削除する

また画像が更新保存されたら hoge_2.jpg としてサーバには保存し、かつて保存してあった hoge_1.jpg を削除する


こうすれば問題は解決するのではないでしょうか?

CGIからブラウザに提示される画像URLは画像が更新されるたびに変化するわけですから、キャッシュの問題は回避されます。


実は、この手段はあちこちの画像掲示板でも採用されている模様です。

やっぱり必ずぶつかる問題のようですね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ