私は過去にこれと非常によく似たいくつかの問題を抱えていました、そしてそれらは通常常にキャッシングに関連しています。また、AJAXリクエストがキャッシュされるため、PHPスクリプトはユーザーの指定された間隔でスリープしなくなります。これが、リクエストが非常に速く完了するのを確認している理由です。
キャッシングの背景
AJAXリソースのキャッシュ方法を制御するためにWebサーバーが発行する応答ヘッダーは実際には3つだけです。これらは、HTTPリクエストとAJAXリクエストの両方に適用されます。目的のためにこれらを実際に理解する必要はありませんが、知っておくとよい情報です。
- Expires-このヘッダーは、新しいバージョンのリソースを取得する必要があるときにブラウザに通知します。たとえば、写真や会社のロゴでは、Expiresヘッダーが数か月先に設定されている場合があります。これは、これらの画像が頻繁に変更されることはないと予想されるためです。一方、時間に敏感なCPU使用率データを取得するAJAXリクエストでは、このデータが常に更新されるように、expires値を-1にする必要があります。
- 最終変更-これは、ブラウザが条件付きGETリクエストをサーバーに送信するために使用できます。サーバーは、リソースが指定された値よりも遅く変更されたかどうかを確認し、変更された場合は更新されたコンテンツを返します
- キャッシュ制御-これにより、プロキシおよびその他のキャッシュがこのリソースのコピーを共有(または非共有)プールに保存して、リソースへのアクセスをさらに高速化できます。
jQuery.load()のしくみ
jQuery.load()は、サーバー上のhtmlリソースに対する単純なGETリクエストを送信することで機能します。jQueryload()
関数はデータをフェッチする最も簡単な方法であり、多くの場合、データを取得するための最良の方法ではないことに注意してください。これは、サーバーからhtmlを取得し、選択したjQueryDOM要素内にhtmlを取り込むための簡単な方法となるように設計されています。ドキュメントの抜粋は次のとおりです。
この方法は、サーバーからデータをフェッチする最も簡単な方法です。$ .get(url、data、success)とほぼ同じですが、グローバル関数ではなくメソッドであり、暗黙のコールバック関数がある点が異なります。成功した応答が検出された場合(つまり、textStatusが「success」または「notmodified」の場合)、. load()は、一致した要素のHTMLコンテンツを返されたデータに設定します。これは、メソッドのほとんどの使用法が非常に簡単であることを意味します。
これ$.load()
は主にhtmlをjQuery要素に挿入する簡単な方法であるため、jQueryライブラリはリクエストがキャッシュされていないことを確認するメカニズムを提供していません。HTMLを取得するだけの場合、特に変更されておらず頻繁にポーリングされている場合は、これらの応答をキャッシュすることでパフォーマンスを大幅に向上させることができるため、これは合理的です。
私がテストしたすべてのブラウザーの中で、IE(9)がAJAX要求を一貫してキャッシュする唯一のブラウザーのようです。FirefoxとInternetExplorerで行われたリクエストの違いを見てください。
Firefox:

インターネットエクスプローラ:

IEからの疑わしい1ミリ秒未満の応答時間に注意してください。 IEは、有効期限が切れる前にキャッシュされたコンテンツを更新したり、キャッシュに関してHTTPリクエストとAJAXリクエストを区別したりすることはありません。AJAX URLを呼び出すたびに新しいデータを確実に受信するために、別のソリューションを試す必要があります。
InternetExplorerがAJAXリクエストをキャッシュできないようにする
IEのキャッシュ制限を回避する方法はいくつかあります。
- のように、ランダム化されたトークン(値なし)をクエリ文字列に追加します
?token=[timestamp]
。リクエストごとにリクエストURLを変更することで、ブラウザはリクエストごとにリソースの異なるキャッシュコピーを保存し、サーバーから最新のデータを確実に取得できるようになります。jQueryは、次のようなタイムスタンプを取得するだけでナンス値を作成します。var nonce = ( new Date() ).getTime();
- GETリクエストの代わりにPOSTを使用してください。POSTリクエストは、サーバー上のリソースを変更するリクエストを送信するように設計されているため、ブラウザがそれらをキャッシュすることはありません。
- ブラウザによるキャッシュを特に禁止するHTTP応答ヘッダーを送信します。これはcpu.phpに実装されます。
$http_response_header
アレイを変更することで、これを簡単に変更できます(ドキュメントについてはこちらを参照してください)
jQuery.ajax()
代わりに使用jQuery.load()
:オプション$.ajax()
を使用して、特定のAJAX呼び出しを指定して強制的に更新することができcache: false
ます。さらに、ajaxSetup()でこれを構成することにより、すべてのAJAX呼び出しが毎回更新されるようにすることができます$.ajaxSetup ({ cache: false });
。これは基本的に#1と同じソリューションですが、JavaScriptコードにナンス値を作成する必要はありません。
すべての選択肢の中で、#4は、作成している要求のタイプを最もよく保持し、構成するのが最も簡単です。
もう1つの提案-関数のwindow.setInterval()
呼び出しに使用するreplay()
ことは、リクエスト間の待機間隔を設定する簡単な方法であり、通常、サーバーよりもクライアントに可変長のスリープサイクルを実装する方が適切です。