web-dev-qa-db-ja.com

私のウェブサイトをキャッシュする方法は?

以前にサイトをキャッシュしようとしたことがないので、Webサイトのキャッシュについていくつか質問があります。

1つ目は、サイトをキャッシュして、クライアントがサイトを閲覧するときに読み込みが速くなるようにする方法です。たとえば、CSSスタイルの画像がたくさんあるのですが、これをキャッシュするにはどうすればよいですか?

Phpでのキャッシュが<head>タグを介して行われる前に読んだことから、キャッシュは.htaccessで行うこともできます(htaccess ^ _ ^を使用していることをうれしく思います)。

このタグをヘッダーに追加しました

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta http-equiv="expires" content="-1">
<meta http-equiv="pragma" content="no-cache">//or content="cache"???

また、これは私のhtaccessの中にあるものです:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

</IfModule>

<IfModule !mod_rewrite.c>    
    ErrorDocument 404 /index.php
</IfModule>
2
Wondering Coder

キャッシングが「ドロップイン」ソリューションになることはめったにありませんが、正しく実装すると、Webサイトの速度が大幅に向上する可能性があります。

あなたが最初に言及する項目「多くのCSS画像」-それ自体はサーバーの問題ではありません。それらをフェッチするには、ブラウザは各画像に対してリクエストを行う必要があり、それぞれに独自のオーバーヘッドがあります。画像をCSSスプライトに結合して、リクエストの数を最小限に抑え、選択した画像形式が適用する圧縮を最大化できるようにします。同様の考え方がCSSファイルとJSファイルにも当てはまります-可能な限り組み合わせて縮小します。ウェブサイト固有の推奨事項については、GoogleのPagespeedまたはYahooのYSlowをお試しください。

サーバー側では、PHPのキャッシュがいくつかあり、変換されたスクリプトの中間形式であるオペコードキャッシュが格納されます。最も一般的に使用されるのはAPCですが、xcacheとeacceleratorです。多くの場合、同様に使用されます(そのうちの1つのみを使用してください)。

PHPの側面から、キャッシュには通常、コンテンツの静的コピーの生成が含まれます。これは、出力バッファリング(ob_ *関数(例:ob_start())を使用して実現できます。前にバッファリングを開始します。コンテンツを送信し、ページが完全に構築された後でバッファリングを終了し、結果のコンテンツをファイルに保存します。次に、PHPスクリプトを試す前に、そのようなファイルの存在を確認します(つまり、キャッシュが存在する場合はそれを提供し、そうでない場合はスクリプトをロードします)。

さらに、Webスタックにレイヤーを追加できます。ワニスが一般的な選択肢です。これは、リバースプロキシおよびキャッシングサーバーです。基本的に、バックエンドサーバーへのリクエストはVarnishによって受信され、ページのコピーが既にある場合は、バックエンドをバイパスして直接提供されます。リクエストのコピーがない場合は、バックエンドに渡されます。ワニスは、キャッシュをメモリに直接保存するように構成することも、ディスクでバックアップされたストレージを使用することもでき、その機能において非常に効率的です。

キャッシュへのあらゆるアプローチと同様に、機密情報が漏洩するという潜在的な問題に直面します。ログインしたユーザーにのみ表示されるはずのページをキャッシュして、認証されていないユーザーに提供することになった場合、問題が発生します。そのため、Varnishのようなサーバーは、Cookieを含むリクエストをキャッシュしない傾向があります。これは、実際に高いヒット率を達成するために考慮することが重要です。

他の考えられる考慮事項は、コンテンツ配信ネットワーク(ユーザーに地理的に近いネットワークエッジの場所を持つサービス)を使用することです。これにより、複数のリクエストをより高速に処理できます。ただし、サービスを提供している場合は、通常、これは大きなファイルの場合の考慮事項です。多くの小さなファイル(画像など)を使用すると、サイトのデザインを改善できる可能性があります。

1
cyberx86

デビッドが述べたように、あなたの質問は非常に広いです。

しかし、あなたの心を読んでみた後、あなたが望んでいるのはHTTPキャッシング機能を使用することであるように私には思えます。 Webサイトにアクセスするユーザーのブラウザーに、画像と.cssファイルをキャッシュして、サイトにアクセスするたびにこのすべてのコンテンツをフェッチしないようにして、読み込みを高速化することをお勧めします。

そうですね、HTTPにはそれを可能にする機能があります。

基本から始めて、HTTPは要求/応答プロトコルです。ブラウザがリソースの要求を送信し、サーバーが応答します。リクエストとレスポンスの両方にヘッダーが含まれています。ヘッダーは、ブラウザとサーバーがそれぞれレスポンスとリクエストを受信したときの動作を説明しています。

.htaccessファイルに応答ヘッダーを設定することで、ユーザーのブラウザに画像と.cssをキャッシュするように指示できます。

この目標を達成するために応答に必要なヘッダーは、以下に説明するものです。

HTTP/1.1は、次のキャッシュ応答ヘッダーを提供します:ExpiresおよびCache-Control:max-age。これらは、リソースの「鮮度の有効期間」、つまり、ブラウザがWebサーバーから新しいバージョンが利用可能かどうかを確認せずにキャッシュされたリソースを使用できる期間を指定します。これらは、無条件に適用される「強力なキャッシュヘッダー」です。つまり、それらが設定されてリソースがダウンロードされると、ブラウザは、有効期限または最大経過時間に達するまで、リソースに対してGETリクエストを発行しません。

最終変更およびETag。これらは、ファイルが同じであるかどうかを判断するためにブラウザがチェックするリソースに関するいくつかの特性を指定します。 Last-Modifiedヘッダーでは、これは常に日付です。 ETagヘッダーでは、これはリソースを一意に識別する任意の値にすることができます(ファイルバージョンまたはコンテンツハッシュが一般的です)。 Last-Modifiedは、ブラウザがヒューリスティックを適用してアイテムをキャッシュからフェッチするかどうかを決定するという点で、「弱い」キャッシュヘッダーです。 (ヒューリスティックはブラウザーによって異なります。)ただし、これらのヘッダーを使用すると、ユーザーが明示的にページをリロードしたときに条件付きGET要求を発行することにより、ブラウザーはキャッシュされたリソースを効率的に更新できます。条件付きGETは、サーバーでリソースが変更されない限り完全な応答を返さないため、完全なGETよりも待ち時間が短くなります。

キャッシュ可能なすべてのリソースに対して、ExpiresまたはCache-Control max-ageのいずれか、およびLast-ModifiedまたはETagのいずれかを指定することが重要です。 ExpiresとCache-Control:max-ageの両方を指定するか、Last-ModifiedとETagの両方を指定することは冗長です。

取得元: http://code.google.com/speed/page-speed/docs/caching.html

これを理解し、ニーズに最適と思われるヘッダーを選択したら、Apachemod_headersとFilesMatchディレクティブを使用してこれを行うことができます。

.htaccessに入れることができるものの例を次に示します(まさにあなたが望むものかもしれません):

<FilesMatch "\.(css|swf|png|jpg|jpeg|gif)$">
Header unset Pragma
Header unset Expires
Header set Cache-Control "max-age=604800"
</FilesMatch>

ただし、その前に、GoogleのPageSpeedプラグインをchrome( http://code.google.com/speed/page-speed/download.html)用にダウンロードすることをお勧めします。 )そしてそれをインストールします。次に、ページ速度テストを実行し、その結果、特に「ブラウザのキャッシュを活用する」セクションを見て、本当にアクションを実行する必要があるかどうかを確認します。

1

少なくとも私の意見では、メタタグを使用して静的htmlファイルのキャッシュを制御することは実際には安定していません。 mod_expires(キャッシュ制御にHTTPヘッダーを使用)を確認する必要があります: http://httpd.Apache.org/docs/2.0/mod/mod_expires.html

動的サイトをキャッシュする場合は、ページ全体またはデータベース要求のみをキャッシュできます(データベース/サイトの設計によって異なります)。たぶんこのリンクは役に立ちます: http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/

0
zaub3r3r

あなたの質問は非常に広いです。 「キャッシュ」はいくつかの異なるレイヤーで行われるため、「ウェブサイトをキャッシュする方法」を尋ねるのは、「夕食を作る方法」を尋ねるのと少し似ています。それを行うには多くの方法があります。

MySQLなどのデータベースを備えた動的なWebサイトがある場合は、データベース層にキャッシュできます。 PHPレイヤーで memcache または [〜#〜] apc [〜#〜] でキャッシュできます。 Varnish などのリバースプロキシを使用するサーバーレイヤー。

そして、これらはクライアント側のキャッシュ(つまり、特定の人の各クライアントのWebブラウザーのキャッシュコンテンツ)にも触れません。これは、 。htaccessとヘッダー情報 で話していることです。

クライアント側のキャッシュではなく、サーバー側のキャッシュに焦点を当てたほうがよいでしょう。

キャッシュアーキテクチャの構築は、アプリケーションの構成要素、コンテンツが変更される頻度、および最新の情報が必要な頻度に大きく依存します。

動的なWebサイトをお持ちの場合は、最初に、独自の組み込みキャッシュメカニズムを使用してMySQLのパフォーマンスを向上させる方法を検討することをお勧めします。

非常に忙しいWebサイトがある場合は、Varnishまたは別のリバースプロキシキャッシングサーバーがどのように機能するかを調べることをお勧めします。

いずれにせよ、これらのトピックを調べて学び、より具体的な質問がある場合は気軽に戻ってきてください。

0
David W