ホームページ  >  記事  >  PHPフレームワーク  >  Swoole の動作: WebSocket に基づいてチャット ルームをすばやく作成します

Swoole の動作: WebSocket に基づいてチャット ルームをすばやく作成します

WBOY
WBOYオリジナル
2023-06-14 16:20:081276ブラウズ

インターネット時代において、チャット ルームは人々がコミュニケーションし交流するための重要な場所になりました。 WebSocket テクノロジーの登場により、リアルタイム通信がよりスムーズかつ安定しました。今回は、Swoole フレームワークを使用して WebSocket ベースのチャット ルームをすばやく構築する方法を紹介します。

Swoole は、C 言語で書かれた高性能 PHP コルーチン ネットワーク通信フレームワークで、非同期 IO、コルーチン、ネットワーク通信、その他の機能を統合し、PHP コードを Node.js イベント駆動型と同じくらい効率的に処理できるようにします。非同期同時プログラミング。 Swoole は、同時実行性の高いネットワーク アプリケーションを開発するための重要なツールであると言えます。

以下では、Swoole を使用して WebSocket に基づいたチャット ルームを実装し、複数人のオンライン チャットをサポートする方法を段階的に紹介します。

  1. 環境の準備

開始する前に、Swoole 拡張機能がインストールされ、WebSocket サポートが有効になっていることを確認する必要があります。

インストール方法は次のとおりです:

pecl install swoole

またはコンパイルしてインストールします:

wget https://pecl.php.net/get/swoole-{version}.tgz

tar xzvf swoole-{version}.tgz

cd swoole-{version}

phpize

./configure --enable-async-redis --enable-coroutine --enable-openssl --enable-http2 --enable-sockets

make && make install

Docker を使用する場合は、Dockerfile に次のステートメントを追加できます。

RUN pecl install swoole 
    && docker-php-ext-enable swoole 
    && docker-php-ext-install pcntl

    クライアント ページ
まず、チャット ルームにメッセージを送信するためのページを作成する必要があります。コードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket ChatRoom Demo</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .container {
            margin: 30px auto;
            width: 800px;
            height: 600px;
            border: 1px solid #aaa;
            border-radius: 5px;
            overflow: hidden;
        }
        .message-box {
            width: 800px;
            height: 500px;
            border-bottom: 1px solid #aaa;
            overflow-y: scroll;
        }
        .input-box {
            width: 800px;
            height: 100px;
            border-top: 1px solid #aaa;
        }
        .input-text {
            width: 600px;
            height: 80px;
            margin: 10px;
            padding: 10px;
            font-size: 20px;
            border-radius: 5px;
            border: 1px solid #aaa;
            outline: none;
        }
        .send-btn {
            width: 100px;
            height: 100%;
            margin: 0 10px;
            background-color: #4CAF50;
            border: none;
            color: white;
            font-size: 18px;
            border-radius: 5px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="message-box"></div>
        <div class="input-box">
            <textarea class="input-text"></textarea>
            <button class="send-btn">Send</button>
        </div>
    </div>
    <script>
        // 初始化WebSocket
        let socket = new WebSocket('ws://localhost:9502');

        // 监听连接成功事件
        socket.onopen = function (event) {
            console.log('WebSocket connection established.');
        }

        // 监听服务端发送的消息
        socket.onmessage = function (event) {
            let message_box = document.querySelector('.message-box');
            message_box.innerHTML += `<p>${event.data}</p>`;
            message_box.scrollTop = message_box.scrollHeight;
        }

        // 监听连接关闭事件
        socket.onclose = function (event) {
            console.log('WebSocket connection closed.');
        }

        // 发送消息
        let send_btn = document.querySelector('.send-btn');
        let input_text = document.querySelector('.input-text');
        send_btn.addEventListener('click', function (event) {
            if (input_text.value.trim() == '') return;
            socket.send(input_text.value);
            input_text.value = '';
        });
    </script>
</body>
</html>

このコードでは、チャット ルーム ページをメッセージ表示ボックスとメッセージ入力ボックスの 2 つの部分に分割します。同時に、WebSocket 接続とメッセージ送信の関連ロジックも定義します。

ローカル環境にデプロイする場合、

WebSocket のアドレスを localhost ではなくローカル IP アドレスに変更する必要があることに注意してください。オンライン環境を使用する場合は、WebSocket アドレスをサーバーのパブリック IP に変更する必要があります。

    サーバー側のコード
次に、サーバー側のコードを記述します。 Swoole が提供するクラスライブラリを利用すると、WebSocket サーバーを簡単に作成できます。コードは次のとおりです。

<?php
// 创建WebSocket服务器
$server = new SwooleWebsocketServer("0.0.0.0", 9502);

// 监听WebSocket连接打开事件
$server->on('open', function (SwooleWebsocketServer $server, $request) {
    echo "connection open: {$request->fd}
";
});

// 监听WebSocket消息事件
$server->on('message', function (SwooleWebsocketServer $server, $frame) {
    echo "received message: {$frame->data}
";

    // 广播消息
    foreach ($server->connections as $fd) {
        $server->push($fd, $frame->data);
    }
});

// 监听WebSocket连接关闭事件
$server->on('close', function (SwooleWebsocketServer $server, $fd) {
    echo "connection close: {$fd}
";
});

// 启动WebSocket服务器
$server->start();

まず、WebSocket サーバーを作成し、アドレス

0.0.0.0:9502 にバインドして、クライアントの接続を待機します。 WebSocket の接続開始、メッセージ、接続終了の 3 つのイベントは on メソッドを通じて監視され、これら 3 つのイベントの処理ロジックが実装されています。

open イベントでは、Swoole によって記録されたクライアント fd を使用してコンソールに出力します。

message イベントでは、クライアントから情報を取得し、echo を使用してそれをコンソールに出力し、foreach Traverse を渡します。接続を確立し、すべてのクライアントにメッセージをブロードキャストするクライアント。

close イベントでは、Swoole によって記録されたクライアント fd を再度使用し、コンソールに出力します。

最後に、

start メソッドを使用して WebSocket サーバーを起動します。

    結論
これまで、WebSocket に基づいた複数人オンライン チャット ルームを実装してきました。クライアント ページでは、任意のメッセージを送信でき、メッセージはすべてのオンライン クライアントにブロードキャストされて表示されます。

Swoole フレームワークを通じて、効率的な WebSocket サーバーを簡単に作成できます。これは、高性能、低遅延、信頼性の高いリアルタイム通信を実現する便利な手段を提供します。

以上がSwoole の動作: WebSocket に基づいてチャット ルームをすばやく作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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