最近、情報のバックグラウンド更新の問題について考えましたが、1つのアイデアが思い浮かびました。
タスクの本質-私たちはニュースリストページにいます。 新しいニュースが届くと、リストを更新する必要があります。 PHPサーバー言語
ajaxによる一定のクエリによるクラシックバージョンを検討してください。
1)クライアントは、たとえば次のアドレスでサーバーにajaxリクエストを送信します-/ ajax / get_upades&time = xxxxxx
2)PHPは、データベース内で時間より新しいレコードを探します
3)存在する場合は、それらを選択して戻る
4)何も返されない場合
この場合、私たちは質問に答えるために常にPHPとデータベースをプルすることを余儀なくされています、新しいデータはありますか?
私はこのアイデアが本当に好きではありませんでした。
また、実装のさまざまな困難性と多数の開いている接続の保持のために、長いポーリングのオプションが好きではありませんでした
次に、PHPを完全にバイパスして、新しいデータの可用性を判断するタスクをサーバー自体にシフトしない理由を決定しました
アイデアの本質は次のとおりです
クライアントは常に空のマーカーファイルをpingします。 それを呼び出す/ ping / new_news
ファイルが送信されると、サーバーはヘッダー「10aa0f-7-4b877e2d4941c」の形式のETagを送信します。 これは、キャッシュメカニズムに関係するヘッダーの1つです。 ETagは、iノード、サイズ、およびmtimeファイル情報に基づいて計算されます。 つまり mtime(ファイル変更時間)を変更すると、サーバーは別のETagを送信します。
必要なのは、mtimeファイルを更新することだけです。たとえば、新しいニュースを挿入するときに()をタッチしますが、データベースにトリガーを作成してレコードを挿入し、ファイルを変更する方がよい
次に、小さなクラスを作成します。 アップデータと呼びましょう
var Updater = function(){ this.params = { period: 3000, url: '', onModified: function(data,x,modified){}, bgPause: false }; this.interval = null; this.ETag = ''; this.lastModified = ''; this.init = function(params){ var me = this; this.params = $.extend(this.params, params); if(this.params.bgPause){ $(window).blur(function(){ me.pause() }); $(window).focus(function(){ me.resume() }); } }; this.start = function(){ var me = this; this.interval = setInterval(function(){ me.doUpdate() }, this.params.period); }; this.doUpdate = function(){ var me = this; $.ajax(this.params.url, { success: function(data,status,x){ if(me.ETag != x.getResponseHeader('ETag')){ me.params.onModified(data,x,me.lastModified); me.lastModified = x.getResponseHeader('Last-Modified'); } me.ETag = x.getResponseHeader('ETag'); }, beforeSend: function(x){ if(me.ETag != '') { x.setRequestHeader('If-None-Match', me.ETag); } }, cache: false }); }; this.pause = function(){ clearInterval(this.interval); this.interval = null; }; this.resume = function(){ if(this.interval != null) return; this.start(); }; };
スクリプトは、Etagの変更が検出され、onModifiedが呼び出されたときに、指定されたURLにリクエストをループで送信します。onModifiedのタスクは、データ自体を受信するリクエストを送信することです。
pingされたファイルを変更した後、Apacheはしばらくの間、古いLast-ModifiedとETagを提供し続けることがあります。 Ajaxリクエストにキャッシュfalseを追加すると、この状況を解決できます
リクエストの数を減らすために、ユーザーにページが表示されないときにサーバーへのpingを停止します
if(this.params.bgPause){ $(window).blur(function(){ me.pause() }); $(window).focus(function(){ me.resume() }); }
ここにそのような考えが思い浮かびました。 あなたの批判、アイデア、提案に耳を傾けます。 みんなありがとう
UPD。 beforeSendパラメーターをajaxリクエストに追加しました