ホームページ PHPフレームワーク Workerman ワーカーベースのリアルタイムプッシュ (Ajax ポーリングの放棄)

ワーカーベースのリアルタイムプッシュ (Ajax ポーリングの放棄)

Jan 20, 2020 pm 01:43 PM
workerman

次のコラム workerman チュートリアルでは、workerman に基づいてリアルタイム プッシュを実装し、Ajax ポーリングを放棄する方法を紹介します。

ワーカーベースのリアルタイムプッシュ (Ajax ポーリングの放棄)

最初にこれらのことについて話しましょう:

TCP/IP

TCP/IP はプロトコル グループです。 . ネットワーク層、トランスポート層、アプリケーション層の3層に分かれています。

ネットワーク層には、IP プロトコル、ICMP プロトコル、ARP プロトコル、RARP プロトコル、および BOOTP プロトコルがあります。

トランスポート層にはTCPプロトコルとUDPプロトコルがあります。

アプリケーション層には次のものがあります。

TCP には FTP、HTTP、TELNET、SMTP などのプロトコルが含まれます。

UDP には DNS、TFTP などが含まれます。プロトコル

短い接続

接続->データ転送->接続を閉じる

HTTP はステートレスです。ブラウザとサーバーが実行するたびに、 HTTP 操作。接続は一度確立されますが、タスクが完了すると接続は終了します。

また、「短い接続」とは、SOCKET 接続が送信され、データが受信された後、すぐに切断されることを意味するとも言えます。

長い接続

接続 ->データ転送 ->接続を維持 ->データ転送 ->。 。 。 -> 接続を閉じます。

長時間接続とは、SOCKET 接続が確立されているかどうかに関係なく接続を維持することを指しますが、セキュリティは貧弱です。

Http 長い接続

HTTP は長い接続を確立することもできます。Connection:keep-alive を使用します。HTTP 1.1 のデフォルトは永続的な接続です。 HTTP1.1とHTTP1.0を比較すると、最大の違いは永続接続サポートの追加(最新のhttp1.0ではキープアライブを明示的に指定できるようです)ですが、やはりステートレスというか信頼できません。

長い接続と短い接続をいつ使用するか?

長い接続は主に頻繁な操作やポイントツーポイント通信に使用され、接続数が多すぎることはできません。各 TCP 接続には 3 段階のハンドシェイクが必要であり、時間がかかります。各操作を接続してから操作すると、処理速度が大幅に低下します。そのため、各操作後に切断されず、途中でデータ パケットが直接送信されます。最初の処理です。TCP 接続を確立する必要はありません。例: データベース接続には長い接続が使用されますが、短い接続で頻繁に通信するとソケット エラーが発生し、頻繁にソケットを作成するとリソースの無駄になります。

WEB Web サイトのような HTTP サービスでは、長い接続はサーバーの特定のリソースを消費するため、通常、短いリンクが使用され、WEB Web サイトでは数千のリンクが頻繁に使用されます。クライアント接続では、短い接続を使用するとリソースが節約されますが、長い接続が使用され、同時に数千のユーザーがいる場合は、各ユーザーが 1 つの接続を占有することが考えられます。したがって、同時実行量は多くなりますが、頻繁な操作が必要ない場合、各ユーザーは短い接続を使用する必要があります。

ワーカーマンそれは何ですか? Workerman は、純粋に PHP で開発されたオープンソースの高性能 PHP ソケット サーバー フレームワークです。モバイル アプリ、モバイル通信、WeChat アプレット、モバイル ゲーム サーバー、オンライン ゲーム、PHP チャット ルーム、ハードウェア通信、スマート ホーム、車両のインターネット、モノのインターネット、その他の分野の開発で広く使用されています。 TCP の長い接続をサポートし、Websocket、HTTP およびその他のプロトコルをサポートし、カスタム プロトコルをサポートします。非同期 Mysql、非同期 Redis、非同期 Http、非同期メッセージ キューなど、多くの高性能コンポーネントを備えています。

本題に移りましょう: リアルタイム通信を実現するために、図に示すように、多くの場合、ajax ポーリング メカニズムが使用されます。 Workerman メソッドは後で使用できます。実装、プロジェクトも TP によって書かれています。公式マニュアルには、上の図に示すように、

は他の mvc フレームワークと組み合わせることが推奨されています (例として ThinkPHP) : ワーカーベースのリアルタイムプッシュ (Ajax ポーリングの放棄)

1. ThinkPHP と Workerman は 2 つ独立しています システムは、相互に干渉することなく独立して展開されます (異なるサーバーに展開できます)。

2. ThinkPHP は HTTP プロトコルを使用して、ブラウザーでレンダリングおよび表示するための Web ページを提供します。

3. ThinkPHP によって提供されるページの js は、WebSocket 接続を開始し、ワーカーマンに接続します

4. 接続後、データ パケット (ユーザー名、パスワード、または何らかのトークンを含む) string) は検証のためにワーカーマンに送信され、WebSocket 接続がどのユーザーに属しているかがわかります。

5. ThinkPHP がブラウザーにデータをプッシュする必要がある場合にのみ、ワーカーマンのソケット インターフェースを呼び出してデータをプッシュします。

6. 残りのリクエストは、ThinkPHP の元の HTTP メソッドに従って処理されます。

概要:

Workerman をブラウザにプッシュできるチャネルとして使用し、データをプッシュする必要がある場合にのみ Workerman インターフェイスを呼び出してプッシュを完了します。ブラウザ。ビジネスロジックはすべてThinkPHP内で完結します。

わかりました、ここで、workerman コンテナを実行します。これは CLI モードで実行されていることに注意してください。

次に、次のように情報の受信で再生します。添付コード

<script>
    // 连接服务端
    var socket = io(&#39;http://127.0.0.1:2120&#39;);
    // uid可以是自己网站的用户id,以便针对uid推送
    uid = 123;
    // socket连接后以uid登录
    socket.on(&#39;connect&#39;, function(){
    socket.emit(&#39;login&#39;, uid);
    });
    // 后端推送来消息时
    socket.on(&#39;new_msg&#39;, function(msg){
        console.log("收到消息:"+msg);  //自己业务逻辑处理
    });
    
</script>
ログイン後にコピー

次に、ユーザーがユーザーに情報を送信するときに

// 指明给谁推送,为空表示向所有在线用户推送
        $to_uid = "123";
        // 推送的url地址
        $push_api_url = "http://127.0.0.1:2121/";
        $post_data = array(
           "type" => "publish",
           "content" => "数据",
           "to" => $to_uid, 
        );
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
        $return = curl_exec ( $ch );
        curl_close ( $ch );
        var_export($return);
ログイン後にコピー

を追加します。このうち、workerman のプッシュ コア コードに

// 全局数组保存uid在线数据
$uidConnectionMap = array();
// 记录最后一次广播的在线用户数
$last_online_count = 0;
 
 
// PHPSocketIO服务
$sender_io = new SocketIO(2120);
// 客户端发起连接事件时,设置连接socket的各种事件回调
 
// 当$sender_io启动后监听一个http端口,通过这个端口可以给任意uid或者所有uid推送数据
$sender_io->on(&#39;workerStart&#39;, function(){
    // 监听一个http端口
    $inner_http_worker = new Worker(&#39;http://0.0.0.0:2121&#39;);
    // 当http客户端发来数据时触发
    $inner_http_worker->onMessage = function($http_connection, $data){
        global $uidConnectionMap;
        $_POST = $_POST ? $_POST : $_GET;
        // 推送数据的url格式 type=publish&to=uid&content=xxxx
        switch(@$_POST[&#39;type&#39;]){
            case &#39;publish&#39;:
                global $sender_io;
                $to = @$_POST[&#39;to&#39;];
                $_POST[&#39;content&#39;] = htmlspecialchars(@$_POST[&#39;content&#39;]);
                // 有指定uid则向uid所在socket组发送数据
                if($to){
                    $sender_io->to($to)->emit(&#39;new_msg&#39;, $_POST[&#39;content&#39;]);
                // 否则向所有uid推送数据
                }else{
                    $sender_io->emit(&#39;new_msg&#39;, @$_POST[&#39;content&#39;]);
                }
                // http接口返回,如果用户离线socket返回fail
                if($to && !isset($uidConnectionMap[$to])){
                    return $http_connection->send(&#39;offline&#39;);
                }else{
                    return $http_connection->send(&#39;ok&#39;);
                }
        }
        return $http_connection->send(&#39;fail&#39;);
    };
    
});
 
if(!defined(&#39;GLOBAL_START&#39;))
{
    Worker::runAll();
}
ログイン後にコピー

ok を実装すれば完了です。

以上がワーカーベースのリアルタイムプッシュ (Ajax ポーリングの放棄)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Nov 08, 2023 pm 06:02 PM

Workerman ドキュメントでファイルのアップロードとダウンロードを実装するには、特定のコード サンプルが必要です はじめに: Workerman は、シンプル、効率的、使いやすい高性能 PHP 非同期ネットワーク通信フレームワークです。実際の開発では、ファイルのアップロードとダウンロードが一般的な機能要件となりますが、この記事では、Workerman フレームワークを使用してファイルのアップロードとダウンロードを実装する方法と、具体的なコード例を紹介します。 1. ファイル アップロード: ファイル アップロードとは、ローカル コンピューター上のファイルをサーバーに転送する操作を指します。以下が使用されます

Workerman ドキュメントの基本的な使用方法を実装する方法 Workerman ドキュメントの基本的な使用方法を実装する方法 Nov 08, 2023 am 11:46 AM

Workerman ドキュメントの基本的な使用方法の実装方法の紹介: Workerman は、開発者が同時実行性の高いネットワーク アプリケーションを簡単に構築できるようにする高性能 PHP 開発フレームワークです。この記事では、インストールと構成、サービスとリスニング ポートの作成、クライアント リクエストの処理など、Workerman の基本的な使用方法を紹介します。そして、対応するコード例を示します。 1. Workerman のインストールと構成 コマンド ラインに次のコマンドを入力して、Workerman をインストールします。

スウールとワーカーマンはどちらが良いですか? スウールとワーカーマンはどちらが良いですか? Apr 09, 2024 pm 07:00 PM

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

Workerman 開発: UDP プロトコルに基づいてリアルタイム ビデオ通話を実装する方法 Workerman 開発: UDP プロトコルに基づいてリアルタイム ビデオ通話を実装する方法 Nov 08, 2023 am 08:03 AM

Workerman 開発: UDP プロトコルに基づくリアルタイム ビデオ通話 概要: この記事では、Workerman フレームワークを使用して、UDP プロトコルに基づくリアルタイム ビデオ通話機能を実装する方法を紹介します。 UDP プロトコルの特性を深く理解し、コード例を通じて、シンプルだが完全なリアルタイム ビデオ通話アプリケーションを構築する方法を示します。はじめに: ネットワーク通信において、リアルタイムのビデオ通話は非常に重要な機能です。従来の TCP プロトコルでは、リアルタイム性の高いビデオ通話を実装する場合、伝送遅延などの問題が発生する可能性があります。そしてUDP

Workerman を使用して高可用性負荷分散システムを構築する方法 Workerman を使用して高可用性負荷分散システムを構築する方法 Nov 07, 2023 pm 01:16 PM

Workerman を使用して高可用性ロード バランシング システムを構築する方法には、特定のコード サンプルが必要です。現代のテクノロジーの分野では、インターネットの急速な発展に伴い、大量の同時リクエストを処理する必要がある Web サイトやアプリケーションがますます増えています。高可用性と高性能を実現するために、負荷分散システムは不可欠なコンポーネントの 1 つになっています。この記事では、PHP オープン ソース フレームワーク Workerman を使用して高可用性負荷分散システムを構築する方法を紹介し、具体的なコード例を示します。 1. ワーカーマンワークの紹介

Workerman ドキュメントにタイマー機能を実装する方法 Workerman ドキュメントにタイマー機能を実装する方法 Nov 08, 2023 pm 05:06 PM

Workerman ドキュメントにタイマー機能を実装する方法 Workerman は、タイマー機能を含む豊富な機能を提供する強力な PHP 非同期ネットワーク通信フレームワークです。タイマーを使用して、指定された時間間隔内でコードを実行します。これは、スケジュールされたタスクやポーリングなどのアプリケーション シナリオに非常に適しています。次に、Workerman でタイマー機能を実装する方法と具体的なコード例を詳しく紹介します。ステップ 1: Workerman をインストールする まず、Worker をインストールする必要があります

Workermanドキュメントにリバースプロキシ機能を実装する方法 Workermanドキュメントにリバースプロキシ機能を実装する方法 Nov 08, 2023 pm 03:46 PM

Workerman ドキュメントでリバース プロキシ機能を実装するには、具体的なコード例が必要です はじめに: Workerman は、豊富な機能と強力なパフォーマンスを提供する高性能 PHP マルチプロセス ネットワーク通信フレームワークであり、Web のリアルタイム通信や長時間の通信で広く使用されています。接続、サービス シナリオ。このうち、Workermanはリバースプロキシ機能もサポートしており、サーバーが外部サービスを提供する際の負荷分散や静的リソースのキャッシュを実現できます。この記事ではWorkermanを利用してリバースプロキシ機能を実装する方法を紹介します。

Workerman ドキュメントでの TCP/UDP 通信の実装方法 Workerman ドキュメントでの TCP/UDP 通信の実装方法 Nov 08, 2023 am 09:17 AM

Workerman ドキュメントで TCP/UDP 通信を実装する方法には、特定のコード サンプルが必要です。Workerman は、TCP および UDP 通信の実装に広く使用されている高性能 PHP 非同期イベント ドリブン フレームワークです。この記事では、Workerman を使用して TCP および UDP ベースの通信を実装する方法を紹介し、対応するコード例を示します。 1. TCP 通信用の TCP サーバーを作成します。Workerman を使用して TCP サーバーを作成するのは非常に簡単です。次のコードを記述するだけです: &lt;?ph

See all articles