背景情報の更新

すべての良い一日。



最近、情報のバックグラウンド更新の問題について考えましたが、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リクエストに追加しました



All Articles