ホームページ > バックエンド開発 > PHPチュートリアル > PHPにおけるPush技術に関する研究(再録)

PHPにおけるPush技術に関する研究(再録)

WBOY
リリース: 2016-06-13 12:32:25
オリジナル
731 人が閲覧しました

PHP のプッシュ技術に関するディスカッション (再版)

? (転載: ?http://vistaswx.com/blog/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 はテスト済みです)。 はページタグに関連しているようです。標準の HTML では同時に複数のリクエストを行うことができます。 ページに一般的な 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 を実装します

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート