2

私は人々のプライベートグループと彼らが投稿した最後のメッセージをリストするシンプルなウェブアプリを持っています。

私は現在、Ajaxを使用して30秒ごとにphpスクリプトをヒットすることでポーリングしています。これにより、すべての人と最新のメッセージが取得され、JSONとして返されます。それを解析してDOMを更新します。

ほとんどの場合、何も変更されていないため、あまり効率的ではありませんが、30秒ごとにすべてのデータを取得します。

  1. これを改善するためのコードだけで、私ができる基本的なことはありますか?

  2. pusher.comのようなものを使用する必要がありますか?

長いポーリングの実装に関するチュートリアルはたくさんありますが、これはできるだけ単純にしたいと思います。

4

3 に答える 3

2

30秒ごとにリクエストhttpを使用すると、多くのリソースが使用される可能性があります。ユーザー数が1000人以上の場合、Webサーバーには適さないと思います。

私はNodejsを使用することを提案してい ます。nodejsはjavascriptサーバーであり、ChromeのJavaScriptランタイム上に構築されたプラットフォームであり、高速で簡単に構築でき、ロングポーリングと非ブロックリクエストをサポートします。

nodejsを使用すると、多くのユーザーを処理でき、リアルタイムアプリケーション用のWebサーバーを構築できます。

ノードjsで実装できるフレームワークはたくさんあります

  1. socket.io
  2. 特急

それを試してみたい場合は、これは簡単なチュートリアルです 。http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial

于 2012-11-05T02:21:07.253 に答える
0

インフラストラクチャの多くを変更することなく、何かが変更されたかどうかを示す簡単なメッセージを返すことができます。

したがって、http://localhost/example/requestが戻ってきた場合:

{
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

リクエストごとに、何も更新されていない場合は、代わりに次を返すことができます。

{
    "updated": false
}

さらに、updated: true更新されたことを示すこともできます。

{
    "updated": true,
    "phoneNumbers": [
        {
            "type": "work",
            "number": "111-222-3333"
        }
    ]
}

全体として、あなたがしなければならないのはupdated、各クエリで返されたオブジェクトのプロパティをチェックすることだけです。次の場合にのみ応答を解析する必要がありupdatedますtrue

しかし、物事の壮大なスキームでは、各HTTPリクエストによって引き起こされるオーバーヘッド。ポーリングするたびに、ブラウザに対して新しいリクエストが行われます。同時ユーザーが多いと、パフォーマンスの問題が発生し始めます。Node.js (viyancsが述べたように)などのリアルタイムWebフレームワークを検討することをお勧めします。これは、各ユーザーの永続的な接続を維持して、(ポーリングではなく)データの「プッシュ」を可能にし、HTTPオーバーヘッドを削減するためです。

于 2012-11-05T02:25:10.380 に答える
0

このような場合、より良い解決策はXHRLongPollingを使用することです。これは、現在行っていることと多少似ています。つまり、AJAXリクエストを作成します。

仕組みは次のとおりです。

現在のようにAJAXリクエストを行います。
サーバー側スクリプトは、更新がある場合にのみ戻ります(エコーします)。存在しない場合は、ループを続け、更新を待ちます。これにより、AJAXリクエストが保留になります。
更新があると、サーバー側のスクリプトが返され、クライアント側のJSがDOMを更新して、すぐに新しいAJAXリクエストを発行します。

PS-これを機能させるには、スクリプトが30秒後にタイムアウトに設定されていないことを確認する必要があります。

psuedo-codeでは、これはサーバー側スクリプトがどのように見えるかです。

$newInfo = false;

while ($newInfo === False) {
    $newInfo = getNewInfo(); // a method that returns the new info. False if nothing has changed
    // sleep here for a bit
    usleep(500000);
}

// will only reach here when something has changed
echo json_encode($newInfo);
于 2012-11-05T02:26:01.223 に答える