0

要求されたファイル (画像) のサムネイルを生成するスクリプトを実装したいと考えています。スクリプトの動作を理解するためのアクションの簡単なリストを次に示します。

  • サーバーへのリクエストurl/preset/filename.jpg
  • ファイルが既にサム化されているかどうかを確認する
  • そうでない場合は、新しいファイルを生成してそのファイルを返します。存在する場合は、サム ファイルを返します。

これは完璧に機能しますが、問題は画像がブラウザによってキャッシュされないことです. 私はキャッシングにあまり詳しくありません。304 Not modified戻るとブラウザがキャッシュから画像を取得するようになると思いましたが、保留状態でハングします。

誰かがこれらの画像をキャッシュする方法を知っていますか?

これは私のスクリプトのショー部分です:

private function _show_image($file_path, $filename, $new = FALSE) {
        $this->load->helper('file');

        if($new) { 
            header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
        } else {
            //header('HTTP/1.1 304 Not Modified');
            header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');  
        }

        header('Cache-Control: public'); // needed for i.e.
        header('Content-type: ' . get_mime_by_extension($file_path));
        header('Content-Transfer-Encoding: Binary');
        header('Content-Length:' . filesize($file_path));
        //header('Content-Disposition: attachment; filename=' . $filename);
        header('Content-Disposition: inline; filename=' . $filename);
        readfile($file_path);
        exit(); 
    }

アップデート

コードを更新して、 が設定されているかどうかを最初にチェックし、$_SERVER['HTTP_IF_MODIFIED_SINCE']設定されている場合はすべてのチェックを行います。しかし、問題は、ブラウザがそのヘッダーを送信していないということです..

ファイルにアクセスしたときの送信ヘッダーと受信ヘッダーは次のとおりです。

リクエスト

Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:PHPSESSID=heiog0hdasg181l45cfbm7u353; __jwpusr=264f6c61-3752-4682-a61b-e02b822c7815
Host:domain.local
Range:bytes=0-
Referer:http://domain.local/test
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36

応答

Cache-Control:public
Connection:Keep-Alive
Content-Description:File Transfer
Content-disposition:inline
Content-Length:24103476
Content-Transfer-Encoding:binary
Content-Type:video/mp4
Date:Thu, 30 May 2013 14:07:02 GMT
Expires:0
Keep-Alive:timeout=5, max=98
Last-Modified:Wed, 29 May 2013 09:03:30 GMT
Server:Apache/2.2.22 (Win32) PHP/5.3.13
X-Frame-Options:SAMEORIGIN
X-Powered-By:PHP/5.3.13
X-XSS-Protection:1; mode=block 
4

3 に答える 3

2

クライアントが次のような If-Modified-Since ヘッダーを送信した場合にのみ、304 "Not Modified" を送信できます。

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

または、If-None-Match:

一致しない場合: "737060cd8c284d8af7ad3082f209582d"

画像がブラウザのキャッシュに残っているのか、削除されたのかはわかりません。正しいアクションは、サムネイルを作成するときに画像を返すことです。サムネイルが存在する場合は、If-Modified-Since ヘッダー (これは現在キャッシュにファイルがあることを示すブラウザーです) を確認し、ファイルが変更されていない場合は 304 Not Modified を返します。それ以外の場合は、ブラウザのキャッシュにないため、ファイルを返します。

If-None-Match システムは eTags を使用しており、それらに対処する必要がない場合は、eTag を使用しないことをお勧めします。

于 2013-05-18T12:24:16.923 に答える
1

私の最初のヒントは、可能であれば、キャッシュを Apache 自体に任せることです。ヘッダーを送信し、キャッシュの要求に応答する方法を最もよく知っています。

本当にこれを自分でやりたい場合は、ブラウザがいつ画像をリクエストしたかを把握するか、変更があったかどうかを確認する必要があります ( If-Modified-Since)。

有効期限も最大有効期間も設定していないため、画像がまったくキャッシュされていない可能性があります。

Expires Mon, 16 Oct 2012 11:07:06 GMT
Cache-Control   public, max-age=120

そして、新しいリクエスト ( なしIf-Modified-Since) を送信したときに、予期しない 304 を送り返しただけです。

于 2013-05-18T12:23:28.533 に答える