Stay up to date with the latest marketing, sales and service tips and news.
この記事は Qt Blog の "HTTP caching with Qt” を翻訳したものです。
執筆: Peter Hartmann 2011年4月29日
この記事では HTTP のキャッシュ が一般的にどのように動作するのかと、Qt ではどうなっているのかを詳細に解説します。
ブラウザがウェブページを読み込む際には様々なリソース(HTML ページ、画像、CSS スクリプト等)がローカルに保存されます。これは同じリソースが再度読み込まれる際に、それをネットワークから再度取得する代わりにローカルに保存されたものを再利用できるかもしれないからです。これはにいくつかの利点があります。
この記事では、リソースがキャッシュから読み込める場合とリソースをネットワークから取得しなければならない場合の判断方法について取り扱います。
HTTP でキャッシュが行われる一般的な流れは次のようになります。クライアント(通常はブラウザ)が "HTTP GET" で最初のリソースのリクエストを行います。この要求時には、一般的にはキャッシュ情報は送られません。サーバーは "HTTP 200 OK" のメッセージと共にデータを返します。この返信時に、クライアント側がキャッシュを制御するためのヘッダをいくつか追加します。これについて見ていきましょう。
サーバーがクライアントのリクエストに応答する際には、そのリソースがディスクにキャッシュ可能かどうかの情報と、可能な場合には、クライアントがそのリソースを次に読み込む際にどのくらいの期間キャッシュからの読み込みが有効なのかについての情報を送ります。別の言い方をすると、サーバーはクライアントにキャッシュ内のリソースがいつ失効し、再度ネットワークから読み込む必要があるかを伝えます。サーバーやプロキシによって送られる有効期限の情報に関する HTTP のヘッダは以下の通りです(不完全ですが)。


ローカルキャッシュにリソースを保持している場合、クライアントはサーバーにそのリソースが更新されているかを確認することが可能です。これはサーバーへの問い合わせを常に伴いますが、サーバーがクライアントにそのリソースを最後に取得してから変更がないことを伝えることでデータを節約することができます。この場合、サーバーは本体の内容を送らずに、ヘッダだけの HTTP メッセージを送ります。更新情報を送るために使われる HTTP ヘッダは以下の通りです(不完全ですが)。
サーバーから:
クライアントから:


面白いことに、日時を含めるヘッダ (“Expires“、“Last-Modified“、“If-Modified-Since“)は HTTP 1.0 の時点で既に規定されていました。HTTP 1.1 では日時よりも、クライアント時刻に対する相対的な時間のデータ(“max-age“、“s-maxage“)や、バージョン情報(“ETag“、“If-None-Match“)に重点を置いています。これは日時を正確に扱うにはサーバーとクライアントの時刻が同期している必要があるからです。ETag や相対的な時間のデータではこれらの時刻が同期している必要がありません。ここで取り上げたすべてのヘッダは現在でも広く使われています。
デフォルトでは [qt QNetworkAccessManager] クラスを使用して HTTP でリソースを取得する際にはディスクキャッシュは利用されません。キャッシュを有効にするには、[qt QNetworkDiskCache] クラスか [qt QAbstractNetworkCache] の派生クラスを実装し、生成したインスタンスを [qt "setCache()" l=qnetworkaccessmanager m=#setCache] で QNetworkAccessManager のインスタンスに設定してください。
これにより、Qt はリソースが有効な場合にはキャッシュから読み込み、そうでない場合にはネットワークから取得するようになります。この際、上記で触れたような更新情報を可能な限り活用します。
Qt がリソースをネットワークから取得する振る舞いは、QNetworkRequest::CacheLoadControlAttribute を [qt QNetworkRequest setAttribute] で設定することによって調整が可能です。
さらにキャッシュの制御をしたい場合には、[qt QNetworkRequest setRawHeader] で(“Cache-Control: max-age” や “Cache-Control: max-stale“ などの)ヘッダを追加してください。
いつも通り、上記に対する投票やコメントをお願いします。
Stay up to date with the latest marketing, sales and service tips and news.
Download the latest release here: www.qt.io/download.
Qt 5.12 was developed with a strong focus on quality and is a long-term-supported (LTS) release that will be supported for 3 years.
Find webinars, use cases, tutorials, videos & more at resources.qt.io
Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.
Näytä tämä julkaisu Instagramissa.Henkilön Qt (@theqtcompany) jakama julkaisu