2012-02-17 9 views
2

データベースからPHPスクリプトによって生成されたJSONコンテンツをキャッシュしようとしています。データセットは非常に安定していますが、変更や追加はほとんどありません。意味データは何週間も変わらない。 問題はLOB列を含んでおり、読み込みにかなりの時間がかかり、テキストファイルからjsonを提供するのに比べて時間がかかります。gitは実際のデータベース呼び出しが遅くなることを意味します。キャッシングJSON:Apache、PHP、jQuery

データをページング付きの表に表示しています(データ型jqueryプラグイン)。ページ変更ごとに、前のページに戻るときにもデータがデータベースから再度フェッチされます。

私は、次の試してみた:

"beforeSend": function (request) 
{ 
    request.setRequestHeader("cache-control", "max-age=86400"); 
}, 

は動作しません。

私はmod_expiresをを試してみました:

ExpiresActive On 
ExpiresDefault "access plus 4 hours" 
ExpiresByType application/javascript "access plus 1 day" 
ExpiresByType application/json "access plus 1 day" 

は動作しません。

したがって、これらの設定はすべて、ファイルシステム上の実際のファイルのみであり、動的生成されたものではありません。

私はApache/PHPを使用して構成可能なアプローチを好むでしょう。なぜなら私はサーバーを完全に制御できないからです。最初の答え、BEFORE

EDIT:キー/値ストアは一種の困難avhieveすることですので、JSONは、複数のレコードが含まれていることを

注意。キーにはたくさんのものが含まれていなければなりません:クエリ/フィルタ式とページングのために要求されたページ。

編集2:

開発と製品。 Windowsが...あるので、memcachedのは本当にオプション...

EDIT 3ではありません。私は解決策をkristovaher試みたが、動作しません

。キャッシュヘッダーは常に応答に含まれておらず、いくつかplaingした後、私は問題を判断したと信じています。 NTLM認証を使用する必要があります。間もなく2回要求を行うとすぐに正常に動作しますが、ユーザーが再認証され、キャッシュコントロールヘッダーが "失われている"ようです。

+1

おそらく、開発者としてブラウザキャッシュが無効になっている可能性があります。 – wormhit

+0

POSTまたはGETのどのようなリクエストを使用していますか? – core1024

+0

GETリクエスト。 @wormhit9:これまで言及したように、かつて私はそうしましたが、新しいFFをインストールして、両方ともtrue(デフォルト)のnetwork.http.use-cacheとbrowser.cache.offline.enableをチェックしたことを思い出してください。面白い私は最近、キャッシングの問題はありませんでしたが、Ctrl + F5は通常うまく動作します。 –

答えて

1

私はちょっと遊んだことがあり、クライアント側でのキャッシュとヘッダーの使用が私の場合はうまくいかないとの結論に達しました。たぶん私は間違っている、多分それは私のアプリケーションが動作する方法またはWebサーバーの設定です。

とにかく私の解決策は、APCを使用することでした。私は窓を使用してい

http://www.php.net/manual/en/book.apc.php

を、適切なバイナリがここで見つけることができます。一つは、あなたのPHPに依存

http://downloads.php.net/pierre/

バージョンとそのコンパイル方法(vc6またはvc9) php_apc.dllは、PHPの拡張ディレクトリに配置する必要がありますし、あなたは、php.iniにライン

extension=php_apc.dll 

を追加する必要があります

その後

あなたはbascially行います

if (apc_exists($key)){ 
    return apc_fetch($key); 
} 
// get data from database because it was not in the cache 
//... 
//add data to cache 
apc_add($key, $result); 

私のページのデータがキャッシュされていない場合は、読み込むのに1〜2秒かかりました。まあそれは悪くないが、非常に遅れて感じる。データがキャッシュにあれば、それは20-30msに似ています。もちろん、この違いは非常に顕著です。

3

キャッシュ制御は応答ヘッダーです。 (編集:それは実際にはリクエストヘッダでもありますが、指摘してくれたGumboに感謝します)レスポンス(PHPが送信するデータ)にそのようなヘッダを追加する必要があります。

<?php 
// How long my cache should last 
$cacheDuration=300; // in seconds 
// Client is told to cache these results for set duration 
header('Cache-Control: public,max-age='.$cacheDuration.',must-revalidate'); 
header('Expires: '.gmdate('D, d M Y H:i:s',($_SERVER['REQUEST_TIME']+$cacheDuration)).' GMT'); 
header('Last-modified: '.gmdate('D, d M Y H:i:s',$_SERVER['REQUEST_TIME']).' GMT'); 

// Pragma header removed should the server happen to set it automatically 
// Pragma headers can make browser misbehave and still ask data from server 
header_remove('Pragma'); 
?> 

実際にはそれより優れているはずです。キャッシュ制御ヘッダーは、単一のクライアントにそのデータをどのように保守するかを伝えるだけで、別のユーザーがサーバーをこのように全面的にやり直す可能性があります。これは、スマートキャッシュシステムの外観です。

  • JSONは何でも作成できます。
  • JSONをファイルシステムに一時ファイルとして保存します。
  • キャッシュコントロールヘッダーを使用してコンテンツをクライアントに送信するため、ブラウザはサーバーからのデータを再度要求せず、代わりにキャッシュを使用します。
  • 別のユーザーがサイトにアクセスし、そのブラウザにそのキャッシュがない場合、スクリプトはポイント2で作成したキャッシュファイルが存在するかどうかを確認し、存在する場合はそのファイルからクライアントにデータを読み込みますそれを再度生成する代わりに。
  • また、キャッシュファイルの経過時間を確認して、数日おきに再度ファイルを生成する必要があります。

しかし、キャッシュに機密情報が含まれている場合、キャッシュから間違ったクライアントに転送されていないことを確認する必要がある場合は注意が必要です。

EDIT:

ライブ例はここにある:http://waher.net/cachetest.php(上記のように同じコード)。

このファイルは、ブラウザからキャッシュから5分間ロードされます。ただし、ページを更新すると、ブラウザのキャッシュは無視され、依然としてサーバーに要求されます。ページをリフレッシュする代わりに新しいタブを開いてURLを入力すると、ファイルがキャッシュからロードされたことがFirebug/Chrome Dev Toolsに表示されるようにすれば、もっとうまく試すことができます。

+0

私はヘッダーを使って簡単な方法を試しました。私はそれで生きることができたと思う。私はデータベースの負荷が応答時間だけではないかと心配しています。しかし、私はあなたの提案に疲れて、それは動作しません。奇妙なことは、キャッシュ制御ヘッダーが必ずしも返されないということです。 –

+0

次に、ライブソフトウェアでその正確なコードを使用しているので、何か間違っています。それは動作します(私はFirebugとChrome Developer Toolsでブラウザをテストしており、ブラウザはキャッシュを使用しています)。この動作をオーバーライドする必要のないヘッダーをサーバーが自動的に設定しないようにしてください。私には分があり、私は生の例で私の元の応答の下にテストを掲示します。 (キャッシュを使用したくないと考えているため、ブラウザを「リフレッシュ」するとブラウザがキャッシュを無視することになります) – kingmaple

+1

あなたは間違っています:[* Cache-Control *](http: //tools.ietf.org/html/rfc2616#section-14.9)はリクエストとレスポンスの両方で使用できます。むしろ* Cache-Control *セマンティクスを正しく理解していないようです。 – Gumbo

関連する問題