"セッションごとに 1 回" のキャッシュ検証を理解する

本記事は、マイクロソフト本社の IE チームのブログ から記事を抜粋し、翻訳したものです。 

【元記事】Understanding Once-Per-Session Cache Validation (2011/6/15 10:04 AM)

 

昨年、IE 9 におけるヒューリスティックな有効期限の改善について説明しました。

ヒューリスティックな有効期限は、キャッシュされたリソースを最新とみなしてよい期限をサーバーが特定できない場合に適用されます。この有効期限は、キャッシュされたリソースの最終更新日時のタイムスタンプと、そのリソースがサーバーからダウンロードされた日時のタイムスタンプから間接的に算出されます。

ヒューリスティックな有効期限の計算は、 [ ツール ][ インターネットオプション ][ 閲覧の履歴 ][ 設定 ] で、 [ 保存しているページの新しいバージョンがあるかどうかの確認 ] オプション (同期モード) が [ 自動的に確認する ] に設定されているときのみ有効です。

image

前述のように、ヒューリスティックな有効期限の機能は、サーバーが応答で最終更新日時のタイムスタンプを提供することに依存しています。サーバーがこのようなタイムスタンプを提供しない場合、Internet Explorer は、代わりとしてそのリソースの同期モードを "セッションごとに 1 "に設定します。

ユーザーは、 [Internet Explorer を起動するたびに確認する ] オプション ボタンを選択することによって、すべてのリソースの同期モードをヒューリスティックな有効期限ではなく "セッションごとに 1 回" に設定することができます。

WinINet は、現在のプロセスがいつ開始されたかを、SessionStartTime という変数を使って常に追跡しています。また、WinINet キャッシュ内のすべてのエントリでは LastSyncTime (最終同期日時) が保持されています。

キャッシュの同期モードが " セッションごとに 1 回" の場合、WinINet は最新かどうかわからないリソースについてそれの再利用を判断するときに、リソースの LastSyncTime とプロセスの SessionStartTime を比較します。LastSyncTime の日時が SessionStartTime よりも古い場合、WinINet はリソースのキャッシュされているバージョンをすぐに再利用するのではなく、最新かどうかをチェックするネットワーク要求をサーバーに対して行います。その結果、リソースの更新バージョンがあればダウンロードされることになります。

"セッションごとに 1 " という同期モードには、この名前からは想像しにくい細かい規則がいくつかあります。

  1. 再利用の上限を設けるため、WinINet は、現在の時刻が LastSyncTime から 12 時間を過ぎている場合も再検証を行います。

  2. IE のすべてのバージョンにおいて、ページ上の JavaScript が ClearAuthenticationCache コマンドを実行すると、WinINet で INTERNET_OPTION_END_BROWSER_SESSION 操作が呼び出されます。内部的には、EndBrowserSession オプションが多くの操作を呼び出しますがその 1 つとして INTERNET_OPTION_RESET_URLCACHE_SESSION 操作が呼び出されます。この操作は、現在のプロセスの SessionStartTime に現在時刻を設定します。したがって、ページがこの API を呼び出す場合は、"セッションごとに 1 回" の設定になっているリソースはすべて、現在のプロセスで再利用される前に再検証されることになります。

  3. INTERNET_FLAG_HYPERLINK が要求に含まれ、キャッシュされた応答に最終更新日時の値が存在しない場合、WinINet は "セッションごとに 1 回" の規則を無視し、再利用の前にキャッシュ リソースの再検証を必ず行います。IE 9 は、最上位のドキュメントやフレーム ドキュメントなど、たいていのドキュメントをダウンロードするときに FLAG_HYPERLINK (BINDF_HYPERLINK 経由) を使用します。

  4. Internet Explorer 8 では、新しいタブを開く (これにより LCIE のタブ プロセスが生成されます) だけで、現在のブラウザー セッション内の他のすべてのタブの SessionStartTime がリセットされます。このような動作はパフォーマンスを低下させるので、IE 9 では改善が行われています。IE 9 では、このパフォーマンス低下を避けるため、1 つのブラウザー セッション内の新しいタブはすべて、そのブラウザー セッションの元の SessionStartTime を継承します。

このような難解なポイントを押さえておくことは、Web 開発者にとって大切なことです。キャッシュヒューリスティックの複雑さを理解し、思いがけない動きにも気をつけながら有効期限を明確に特定してください。

ありがとうございました。

Eric