私のサイトの 1 つで、ユーザーの画像をユーザー フォルダに「1.jpg」として保存するだけです。つまり、プロフィール写真を変更しても、ファイル名は同じままです。
ユーザーのプロファイルが表示され、再表示されるたびに同じ古い写真が何度もダウンロードされないように、画像キャッシュを利用したいと思っていましたが、同時に、ユーザーのブラウザーに変更されている場合は、新しいものをダウンロードしてください。
PHPでこれを行うにはどうすればよいですか?
私のサイトの 1 つで、ユーザーの画像をユーザー フォルダに「1.jpg」として保存するだけです。つまり、プロフィール写真を変更しても、ファイル名は同じままです。
ユーザーのプロファイルが表示され、再表示されるたびに同じ古い写真が何度もダウンロードされないように、画像キャッシュを利用したいと思っていましたが、同時に、ユーザーのブラウザーに変更されている場合は、新しいものをダウンロードしてください。
PHPでこれを行うにはどうすればよいですか?
最も簡単な修正方法は、各ユーザーのプロファイル ピックに GUID.jpg というランダムな名前を割り当てることです。プロフィール写真を変更するたびに、新しい GUID を割り当てます。
これで、永久にキャッシュするようにクライアントに指示するとともに、このプロファイル写真をサーバーに送信できます。
一般的に使用される解決策の 1 つは、画像の URL を次のようにすることです。
http://www.example.com/path/to/images/1.jpg?v=123456
ここで、/path/to/images/1.jpg
は画像の実際の URL パスですが、?v=123456
は URL の末尾に付けられた単なるダミー クエリです。クエリ文字列は、バージョン番号、タイムスタンプ、画像コンテンツのハッシュなど、画像が変更されるたびに変更し、変更されない場合は同じままである限り、何でもかまいません。
トリックは、そのような URL を提供するように要求されたときに、Web サーバーがクエリ文字列を無視することです。これは、URL が実際には静的ファイルを指しているためです。しかし、ユーザーのブラウザ (およびその間のすべてのプロキシ) にとって、異なるクエリ文字列を持つ URL は完全に異なるため、クエリ文字列を変更すると、ブラウザはファイルを再読み込みする必要があります。
したがって、クエリ文字列を変更することでリロードを強制できることを知っていれば、無期限のキャッシュを許可するように Web サーバーExpires
とHTTP ヘッダーを送信するように構成できます。これを行う 1 つの方法は、 mod_expiresCache-Control
でApache を使用している場合、イメージ ディレクトリに次の行を含むファイルを配置することです。.htaccess
ExpiresActive On
ExpiresDefault "access plus 1 year"
この手法は、多くの人気のある Web サイトで使用されています。たとえば、まさにこのページの HTML ソースを見ると、このページのスタイル シートが次のような URL から読み込まれていることがわかります。
http://cdn.sstatic.net/stackoverflow/all.css?v=7cd8ea9d6f1e
ここで、?v=7cd8ea9d6f1e
は上で説明したのと同じダミーのクエリ文字列です。それを変更して、実際に同じファイルが返されることを確認することで確認できます。
E-Tagging、Last-modified、基本的には、ブラウザーがリソース、つまりプロフィール写真が変更されたかどうか、サーバーからダウンロードするか、キャッシュから取得するかを決定できるようにするヘッダー。
画像を直接リンクするのではなく、php を使用して画像を呼び出すことをお勧めしますか?
<?php
$lmt = filemtime($_GET['file']);
$etag = md5($lmt);
header('Content-type: application/x-javascript');
header("Cache-Control: max-age=3600");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lmt)." GMT");
header("ETag: ".'"'.$etag.'"');
if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lmt || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
?>
コンテンツは、このコード セグメントの下に読み込まれます。