2013-04-20 19 views
7

Webサーバーからのデータの再読み込みには、「方法」(つまり、最も効率的で、最も一般的に受け入れられる方法)を探していますフロントエンド。エンドアプリケーションにおいて、Iは、データが書き込まれなければならないいくつかの出力フィールドを持つことになり、このような例:効率的なデータの再読み込みとサーバーからクライアントへのデータの読み込み

enter image description here

データストリームは最終用途における互いに異なるあろう。サーバーから最新の最新のデータで回線を再ロードする必要があります。

私はAjaxリクエストを毎秒更新することを考えていましたが、これを行うには別の方法が必要です。 Ajaxリクエストは多くのデータトラフィックを引き起こします。また、Facebookのチャットを使用する場合、毎秒待つ必要はなく、チャットはほぼ即時に受信されます。それでもMozilla Firefoxの開発ツールを使用しているときにAjaxのポーリングリクエストが行われることはありません。これは、これを行うための別の方法があると私に思い出させました。

私はNode.jsを調べましたが、私のホストでは不可能と思われます。

私はAjax Pushについて話していると聞いていますが、それは私が使うべきものですか?もしそうなら、基本的な使用例を教えてください。

もしそうでなければ、1秒以内に複数のデータストリームをリロードする必要がある場合は、、次にとなるでしょうか?

要件は、の速度およびのデータトラフィックが小さいです。です。したがって、サーバーを継続的にポーリングするオプションはありません。これは膨大なオーバーヘッドを招くためです。

私はそれが重要ではないと思っていますが、バックエンドではPHP5.3、フロントエンドではjQuery 1.9.1でJavaScriptを使用しています。

答えて

8

で応答を送信する。この質問は、回数を尋ねたが、わずかに異なる方法でされています。要約で

:ここで読む価値があるいくつかの参照であるあなたが見ている場合建てよApache上でPHPを使用し、オープン持続的な接続(HTTPの長いポーリングまたはストリーミング)を保持するソリューションは、非常に迅速にリソースを使い果たします(非常に非効率的です)。したがって、hosted solution(*免責事項 - 私はホストされたソリューションのために働いています)を使用する方が良いでしょう。

HTTP-LongポーリングとHTTPストリーミングは、Server-SentイベントとWebSocketによって置き換えられたソリューションです。したがって、可能であれば(Webクライアントがサポートを提供する場合)、HTTPベースのソリューションに落ちる前に、これらのソリューションの1つを使用する必要があります。優れたリアルタイムWebテクノロジーが自動的にこれを処理します。

図には、複数のデータストリームを購読していることが示されているので、これに当てはまるPublish/Subscribeソリューションも考慮する必要があります。ここでも、良いリアルタイムのWebテクノロジーソリューションがあなたにこれを提供します。

realtime web technology guideも参照してください。

+1

+1この情報を追跡すると、最近リリースされたプロジェクトのためにしばらく時間がかかりました。私はゼロのWeb開発経験を持っていて、Webサーバーからブラウザにデータをプッシュすることは珍しいことを知って驚いた。 –

2

あなたが探しているものは、一般的にCometと呼ばれています。このテクニックは、多くの場合、次のように行われました。

  • クライアント(Webブラウザ)は、サーバーに新しいデータを要求します。これはページをリロードするのではなく、JavaScriptで行われます。
  • サーバーは、クライアントのデータがあるときに要求に応答します。繰り返しますが、これはリロードされるページ自体ではないため、UIには影響しません。つまり、データのloaindgはJavaScriptコードで「バックグラウンドで」行われます。
  • サービング側では、要求は新しいデータを待機し、利用可能な場合は新しいデータを返します(サーバーで定義されたタイムアウト間隔に達すると)何も返しません。このタイムアウトは通常、ブラウザのHTTPタイムアウトよりも低く設定されます。この理由は、特定のクライアントに特定のデータがあるかどうかをサーバーが認識できるようにするためです。要求がクライアント側でタイムアウトすることが許可されている場合、クライアントがタイムアウトした後に元の要求がサーバーによって応答され、クライアントはデータを取得しません。

データは実際には通常JSONとして転送されますが、任意のエンコーディングを選択できます。これを行う方法の一例については、hereを参照してください。 Gooshは、この手法のもう1つの例です。Interactive Python Shellもあります。 allのコードは利用可能です。


PHP側では、これらの「バックグラウンド」JavaScript Comet要求に応答するページを作成したいと考えています。ユーザーが読み込んだページと同じページでも構いませんが、説明が簡単です。したがって、ユーザはindex.phpをロードし、JavaScript CometコードはgetNewData.phpを呼び出して新しいデータを取得します。

getNewData.phpでは、イベントを待ってからデータを返すことをおすすめします。ポーリングを使用したくないのですが、イベントを待つためにさまざまなプロセス間通信戦略を使用できるようにするPHPライブラリがあります。this question for instanceを参照してください。以下のようになりますあなたのgetNewData.phpための高レベルの擬似コードは次のとおりです。

  1. 解析JSON要求
  2. (タイムアウト付き)効率的な待機状態を入力し、あなたを待っている「新しいデータが利用可能である」
  3. なかった前のイベントステップタイムアウト?
    はい:
    ませ一切のデータがないことを示す応答を送信します。新しいデータ
+0

この回答は技術的に正しいものですが、時代遅れで非効率的な解決策を提案しています。 Cometは、要求された機能性を実現するためのHTTPハックの傘の用語です。 HTML5は、[Server-Sent Events](http://en.wikipedia.org/wiki/Server-sent_events)と[WebSockets](http://en.wikipedia.org/wiki/WebSocket)を導入し、これらのハッキングは無かったこれらのタイプの問題を解決するためのコールの最初のポートを長くします。さらに、PHPサーバ上でのlong-pollingアプローチ(この回答で概説)は非常に非効率的です。 – leggetter

関連する問題