要件:
会員サイト内に通知機能を作りたい。以前の ajax クエリは使いたくないのですが、プッシュ技術があると聞きました。以下の記事は、
から転載した、優れた紹介記事です。======================================== ===== =========================================
PHP のプッシュ技術に関するディスカッション? [http://vistaswx. /article/php-server-push]
?
リアルタイム Web アプリケーションに対する人々の需要が高まるにつれ、チャット、メッセージ リマインダー、特にソーシャル ネットワークでサーバー プッシュ テクノロジが台頭し始め、リアルタイム アプリケーションのデータ フローの中核となっています。このブログでは、PHP に適したさまざまな Push 実装方法とその利点と欠点について説明します。
1. サーバープッシュとは
チャット アプリケーションで、従来の ajax が受信メッセージに慣れている場合、通常は一定時間ごとに情報を取得することで実現されますが、実際にはこの方法には大量のクエリが含まれており、無駄が生じます。チャットなどの Web アプリケーションでは、フロントエンドが常にサーバーに「メッセージが来ていますか?」(プル) と尋ねるのではなく、サーバーが特定の時間に新しいメッセージを積極的にフロントエンドに通知する (プッシュ) 必要があります。 。これが、このテクニックがリバース Ajax と呼ばれることが多い理由です。
その他の別名: Comet、Reverse Ajax
?
2. プッシュの実装方法
実際、いわゆるプッシュ テクノロジは、現在、3 つの主要なカテゴリに基づいています。もう 1 つは、従来の HTTP プロトコルを使用しないものです。 Flash または HTML5 WebSocket テクノロジー。これら 3 つのカテゴリがどのようにして生じるかについては、次に説明します。
1) Ajax ロングポーリング
Ajax ロング ポーリングは本質的にはプルですが、リアルタイム パフォーマンスが高く、無駄なリクエストが少なく、優れたプッシュ実装ソリューションです。ただし、それはネットワーク上の不必要な消費を削減するだけです。
コア:? クライアントが ajax リクエストを開始し、サーバーはタイムアウトに達するか、クライアントが待機するまでリクエストを保留します。 ajax 戻った後、データを処理し、次の ajax リクエストを開始します。
利点:? 高い互換性と簡単な実装
?欠点:? PHP のような言語の場合、リアルタイムである場合、いつ保留されるかが不確実であることが多いため、サーバーに大きな負荷がかかります。 PHP スクリプトがシェルブされるたびに while ループを実行する必要があります。
もちろん、サーバーが毎秒更新される場合でも問題ありませんが、リアルタイムのパフォーマンスは低下します。
注: ? ブラウザには接続数の制限があります。現在のページに戻りを待っている ajax リクエストがある場合、他の ajax リクエストは保留されるという結論に達しました (Chrome、Firefox はテスト済み)。ページに一般的な ajax 要件がある場合はどうなるでしょうか?解決策は、Comet ロング ポーリングが別のドメイン名で実行されるフレームワークを開くことです。クロスドメインの問題に注意する必要があります。
PHP 実装:?Jquery php 実装 Comet
関連:Ajax クロスドメインおよび JS クロスドメイン ソリューション
?
2) フレームロング接続
ajax に触発されて、フレームワークの下での長い接続が登場しました。
コア: ? フレームは通常のリクエストを開始し、サーバーはプッシュが必要な場合はリクエストを保留します。出力は
スクリプトを直接実行し、接続を維持します。タイムアウトの問題が心配な場合は、フレーム クエリに変更できます。
利点: 1
と同じ高い互換性機能欠点:? 最大の問題は、フレームが読み込まれている場合、ブラウザに常に「読み込み中」と表示されることですが、これは非常に弱いです (解決策については、このページの最後にある関連する資料を参照してください)。記事)。同様に、サーバーは多数のサイクルを保持できる必要があります。また、同一ドメイン接続に制限があるかどうかはテストしていません。
?
?
3) Flash/HTML5 WebSocket
フラッシュを使用して WebSocket を起動すると、以前の問題がすべて即座に解消されます。
利点:?標準化、リアルタイム、プッシュ
欠点:? サーバーは WebSocket を処理できる必要がありますが、Flash も HTML5 もサポートしていない場合はどうなりますか?
PHP 実装:?今すぐ HTML5 WebSocket の使用を始めましょう
?
6) 互換性のあるカプセル化層 (socket.io) を使用します
上記の各方法には長所と短所があるため、最終的な解決策はそれらを組み合わせることです。 WebSocket が使用可能な場合は、WebSocket を使用します。HTML5 機能がサポートされていない場合は、Flash に戻ります。Flash がない場合は、Ajax ロング ポーリングに戻ります。これは私のRainbowfishの仕組みでもあります。
利点: ? 高度にカプセル化されており、非常に簡単に記述でき、実装方法についてほとんど心配する必要がありません。リアルタイム、超低負荷、高同時実行性。
欠点:? 実際、socket.io のサーバー側の要件は php ではなく、node.js です。
個人的な意見:? あなたが独立したホストでプログラムを実行できる場合、socket.io と Node.js を組み合わせるのは非常に効率的な選択です。なぜ? PHPのサーバー側の高負荷も回避できるからです。
Rainbowfish のメッセージング システムは次の方法で実装されます。すべてのクライアントは、socket.io を介して nodejs サーバー上でハングします (注: ハングするだけで、メッセージをプッシュする必要があるため、ループは必要ありません)。サーバーは(たとえば、アドレスにアクセスすることによって)nodejs と通信し、どのメッセージをどこにプッシュするかを指示します。nodejs がプッシュ信号を受信した後、socket.io を通じてリアルタイムでデータをブラウザーに送信します。これは実際には一方通行です。nodejs サーバーには PHP と通信する機能がなく、実際には PHP を Web ページに直接接続する必要がないからです。
?
3. 結論
実際、最初の方法 (Ajax Long Pull) は良い方法ですが、php を使用して完了するとサーバーの負荷が少し高くなりますが、これは実際には一般的な問題であり、socket.io で解決できます。最後にリストされているこの問題は別のアーキテクチャに属しているため、この組み合わせはプッシュを実装するためにほぼすべてのスクリプト言語で使用することもできます。
非常に高いリアルタイム要件を持つアプリケーションの場合、おそらく PHP を使用してリアルタイム部分を実装するのは良い選択ではなく、非常に大きなサーバー負荷に直面することになります (この問題は、待機中のイベントをサポートする拡張機能を作成することで解決できます) ); メッセージ プロンプトのみの場合は、サーバーの更新間隔を 2 番目のレベルに調整しても、負荷は許容範囲内になります。 しかし、用途が何であれ、これらのノンブロッキング言語と連携するのが最良の選択かもしれません。
4. 関連記事
PHP を使用して COMET を実装する方法
今すぐ HTML5 WebSocket の使用を始めましょう
彗星(Wikipedia)
Ajax クロスドメインおよび JS クロスドメイン ソリューション
Jquery php は Comet を実装します
=========================================== === ==============================================
?
彗星の研究[http://lync.in/research-on-comet/]
?
Web アプリケーションでは、クライアント側の AJAX テクノロジーが非常に一般的になり、人々の心に深く根付いていますが、同時に、オンライン監視、リアルタイム データ表示、インスタント メッセージングなどの他のアプリケーションも普及しています。フロント デスクでは、このようなサーバー プッシュ動作 (ブラックベリーを思い出させるかもしれません) には、バックグラウンド データの変更をリアルタイムで表示する必要があります。これは、この記事で紹介する Comet です。これは、長時間維持するサーバー プッシュ ソリューションです。プラグインをインストールしない http 接続。
計画では次の 2 点を考慮する必要があります。
- ブラウザの多用途性、さまざまな実装構造モデルのサポート。
- 長時間の接続によるサーバー リソースの占有とサーバーの耐久性。
Comet のクライアントとサーバーの対話フロー
業界には Comet 実装のための 2 つの主要なソリューションがあります:
-
AJAX ベースのポーリング (ロングポーリング) 方式
このメソッドは、クライアントが AJAX リクエストを発行し、応答があるかタイムアウトになるまでサーバーがリクエストをブロックします。サーバーから指示を受信した後、クライアントは応答して新しいリクエストを発行します。
実装レベルでは、XMLHttpRequest のステータスがロードステータスである 4 のときにクライアント側の処理が実行され、Gecko (Firefox) と Webkit (Chrome、Safari) は現在、readystate が 3 のときの読み取りをサポートしています (もちろん、読み取ることができるのはリクエストによって返された文字列の内容のみであるため、命令の境界を自分で決定する必要があります)。Trident (IE) は、途中で読み取られた場合にエラーをスローします。これを適切に解決するには、IE8 で XDomainRequest を使用できます。問題があります (Eric Law の Internet Explorer での COMET ストリーミング [] を参照)。
現在、Kaixin.com はこのアプローチを採用しています。
- ?
-
iframe と htmlfile に基づくストリーミング方法
このメソッドは iframe メカニズムを使用し、特定の URL に対して iframe リクエストを作成し、ページをロードすることでサーバーから継続的にデータを取得します。ここでサーバーから取得されるデータのほとんどは、現在の JavaScript の参照と操作用です。ページ上の機能。
このソリューションの明らかな欠点は、ページに常に読み込み中であることが表示されることですが、これは IE ではさらに顕著になります。 Google の天才たちは、htmlfile の ActiveX コントロールを使用してこの問題の解決策を考え出しました。詳細については、Alex Russell の「Google の素晴らしい JavaScript の奥深くに埋められているものは何ですか?
」を参照してください。現在、Renren と GTalk がこの方式を採用しています。
記事の冒頭で述べた汎用性とパフォーマンスに加えて、考慮すべき点がいくつかあります。
- データ交換の形式。データ交換の形式がプッシュであるため、必然的に命令キューが存在するため、実行命令とデータ命令の両方を詳細に合意する必要があります。 🎜> 一般的には、JSON ソリューションは比較的一般的です。 ブラウザ独自の接続制限。 HTTP 1.1 仕様では、クライアントがサーバーとの間に 3 つを超える HTTP 接続を確立してはならないと規定されており、IE はこれを厳密に遵守しているため、フロント デスクはリクエストを処理する際にリクエストの数を慎重に制御する必要があります。
Comet のフレームワークのフロントエンドには、Pushlet、dwr、dojo などが含まれ、サーバーサイドには Jetty、Meteor、Orbited、Glassfish、Alpha が含まれ、実装される製品言語も Java、C、Python、Perl をカバーします、Ruby、Erlang、.Netなど。
次世代 HTML5 の WebSocket は Comet の新たな出発点となりますが、その前に非プラグイン Web レベルでのさらなる議論や技術は必要ありません。
この記事は Comet テクノロジーの概要を示したものであり、今後の記事で WebSocket についてある程度説明および実証する予定です。
参考:
- これは php Comet の例です PHP で COMET を実装する方法。こちらをチェックしてください
- これは、developerWorks での Comet の 紹介 です。 これらは、現在の Comet サーバー側製品と紹介の一部です。
- もちろん、Wikipediaの彗星の説明もとても詳しいです。
- AjaxPatterns に関するいくつかの紹介もご覧ください。
- 最後に、CometDaily は Comet の最新ニュースと知識を学ぶのに価値のある場所です。
- =========================================== === ============================================== === ====
Comet: HTTP ロング接続に基づく「サーバープッシュ」テクノロジー
? [http://www.ibm.com/developerworks/cn/web/wa-lo-comet/]
ps: 上記の記事を読めば十分理解できるはずです。 1 つ使用してください。ただし、プロジェクトではまだプッシュ テクノロジーを使用していません。その理由は、まだプッシュ テクノロジーをいじる時間がないからですが、ローカル テストでは通常のことです。
以下に、プロトタイプと jquery の PHP 実装のコード例を示します。 [サンプル コードはインターネットから取得され、テストされています。使いやすい】
http://bbs.php100.com/read-htm-tid-290215-ds-1.html