6

私のajaxが多いサイトのいくつか(私が構築したサイトではなく、私が訪問したサイト)に特定の自動更新機能があることに気づきました。たとえば、GMailでは、新しいメッセージを受け取った場合、ページをリロードせずに新しいメッセージが表示されます。FacebookブラウザベースのIMクライアントでも同じです。私の知る限り、サーバーとブラウザーのバインディングを処理するJavaアプレットはないので、AJAXと、おそらく私が知らない要素によって行われていると思います。したがって、私の推測では、次の2つの方法のいずれかで実行されます。

  1. javascriptは、サーバー側スクリプトに対して安定した「ping」を実行し、利用可能な更新をチェックします(これにより、これらのページの一部が他の高負荷のページをクロールする理由が説明されます)。また

  2. javascriptはぼんやりと座っており、サーバーサイドスクリプトは実際にブラウザへの更新を「プッシュ」します。しかし、これが可能かどうかはわかりません。まだpingを実行するある種のAJAX関数があると思いますが、それはすべて「更新はありますか?」と尋ねるだけです。サーバースクリプトには、「いいえ」または「質問してよかった」という単純なブール値があります。ただし、この場合、データの変更はスクリプトを直接呼び出す必要があります。これにより、データの変更の準備が整い、ブール関数に変更が加えられます。

それで、それは可能/実行可能/それがどのように機能するのですか?私は次のようなものを想像します:

誰かが電子メール/IM/ DBの更新をサーバーに送信し、サーバーがスクリプトのURLと関連するGET変数を使用してスクリプトを呼び出し、スクリプトが変更を記録して「利用可能な更新」変数を更新し、AJAXが応答を取得します。実際に更新すると、AJAXは通常の「更新ページ」機能を実行します。この機能は通常の更新スクリプトを実行してブラウザに出力します。

jsが常にチェックを行っているだけで、a)サーバーが1.5秒ごとに動作し、b)ブラウザが1.5秒ごとに動作する必要があるため、私は質問します。ああ、私はIMを手に入れました!本物のIMクライアントのように!」

4

2 に答える 2

6

コメットについて読む

于 2009-08-10T12:39:56.423 に答える
0

私は実際に、Ajax を使用する小さな .NET Web アプリに取り組んでおり、長いポーリング手法が説明されています。

使用しているテクノロジーに応じて、スレッド シグナル メカニズムを使用して、更新が取得されるまでリクエストを保持できます。ASP.NET を使用して、サーバーを 1 台のマシンで実行しているので、Producer オブジェクト (データを処理するスレッドを含む) への参照を保存します。データ プルを開始するために、サービスの Subscribe メソッドが呼び出され、Producer に登録された Consumer オブジェクトが作成されます。Consumer がロング ポーリング モードの場合、新しいデータを受信するたびに通知される AutoResetEvent があり、Web クライアントがデータを要求するたびに、Consumer は最初にリセット イベントを待機し、それを返します。

しかし、あなたはPHPについて何か言及しています-私が知る限り、永続性はシリアル化によって維持され、実際にはオブジェクトをメモリに保持しないため、 $_CACHE[] または $_SESSION[ を使用して Producer オブジェクトを参照する方法がわかりません]。私が PHP で開発したときは、マルチスレッドについて何も知らなかったので、いじりませんでしたが、調べてみてください。

無限ループを使用すると、多くの処理能力が消費されます。最初に他のすべてのオプションを使い果たします。

于 2009-08-17T17:35:28.553 に答える