ホームページ > バックエンド開発 > PHPチュートリアル > PHPとWebSocketの連携でリアルタイムチャットルームの開発を実現

PHPとWebSocketの連携でリアルタイムチャットルームの開発を実現

PHPz
リリース: 2023-06-25 13:16:02
オリジナル
1628 人が閲覧しました

Web 開発の分野では、リアルタイム チャット機能がますます普及しています。これにより、ユーザーはリアルタイムで簡単に対話でき、コミュニケーションと理解を強化できます。リアルタイム チャットを実装するには、WebSocket プロトコルを使用する必要があり、WebSocket リクエストを処理できるプログラミング言語が必要です。この記事では、PHP と WebSocket の統合を使用したリアルタイム チャット ルームの開発を実装する方法を紹介します。

WebSocket は、ブラウザとサーバー間のリアルタイムのデータ送信を可能にする全二重通信プロトコルです。 HTTP リクエストとは異なり、サーバーは WebSocket 接続の確立後にデータをブラウザにプッシュできます。したがって、WebSocket を介してクライアントとサーバーの間で双方向のデータ通信を行うことができます。ユーザーがチャット ルームに参加または退出すると、メッセージはすぐに他のオンライン ユーザーにプッシュされます。これがリアルタイム チャットの基本原理です。

まず、WebSocket リクエストを処理するためにサーバー側で PHP スクリプトを作成する必要があります。 PHP の swoole 拡張機能は、WebSocket サーバーの開発に役立ちます。次に、チャット アプリケーションを段階的に実装していきます。

1. swoole 拡張機能をインストールする

swoole 拡張機能を使用するには、まずそれをインストールする必要があります。 Linux システムに swoole をインストールするには、次のコマンドを使用します。

pecl install swoole
ログイン後にコピー

Windows システムで PHP を使用する場合は、swoole の GitHub リポジトリから関連する DLL ファイルをダウンロードして手動でインストールできます。

2. WebSocket サーバーのセットアップ

swoole 拡張機能のインストールが完了したら、それを使用して WebSocket サーバーの作成を開始できます。以下は、WebSocket サーバーを作成する基本コードです。

//创建WebSocket服务器
$server = new swoole_websocket_server("0.0.0.0", 9501);

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

//监听WebSocket消息事件
$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

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

//启动WebSocket服务器
$server->start();
ログイン後にコピー

このコード スニペットでは、WebSocket サーバーを作成し、イベント ハンドラー関数を登録します。 「open」イベントでは、WebSocket 接続が開いているというメッセージを出力します。 「message」イベントでは、WebSocket セッションに関する情報を出力し、クライアントにメッセージを送信します。 「close」イベントでは、WebSocket 接続が閉じられたというメッセージを出力します。

3. チャット ルーム ロジックのセットアップ

これで、WebSocket サーバーが正常に作成され、イベント処理関数がセットアップされました。次に、チャット ルーム ロジックの実装を開始できます。

ユーザーがチャット ルームに参加または退出したときにすべてのオンライン ユーザーに通知するメッセージ ブロードキャスト機能を設定する必要があります。以下は、メッセージ ブロードキャスト関数のコードです。

//广播消息
function broadcast($server, $frame, $users) {
    $data = json_decode($frame->data, true);
    switch ($data['type']) {
        case 'enter':
            $users[$frame->fd] = $data['name'];
            $msg = $data['name'] . ' joined the room.';
            break;
        case 'leave':
            $name = $users[$frame->fd];
            unset($users[$frame->fd]);
            $msg = $name . ' left the room.';
            break;
        case 'msg':
            $name = $users[$frame->fd];
            $msg = $name . ': ' . $data['msg'];
            break;
    }
    foreach ($server->connections as $fd) {
        $server->push($fd, json_encode(['type' => 'msg', 'msg' => $msg]));
    }
}
ログイン後にコピー

このコード スニペットでは、switch ステートメントを使用してさまざまな種類のメッセージを処理します。ユーザーがチャット ルームに参加または退出すると、ユーザー リストが更新され、通知メッセージが送信されます。ユーザーがメッセージを送信すると、メッセージの前にユーザー名が付けられ、すべてのオンライン ユーザーにブロードキャストされます。

4. 完全なチャット ルーム コード

必要なコンポーネントがすべて準備できたので、完全なチャット ルーム コードの作成を開始できます。以下は完全なチャット ルーム コードです:

//创建WebSocket服务器
$server = new swoole_websocket_server("0.0.0.0", 9501);

//定义用户列表
$users = [];

//广播消息
function broadcast($server, $frame, $users) {
    $data = json_decode($frame->data, true);
    switch ($data['type']) {
        case 'enter':
            $users[$frame->fd] = $data['name'];
            $msg = $data['name'] . ' joined the room.';
            break;
        case 'leave':
            $name = $users[$frame->fd];
            unset($users[$frame->fd]);
            $msg = $name . ' left the room.';
            break;
        case 'msg':
            $name = $users[$frame->fd];
            $msg = $name . ': ' . $data['msg'];
            break;
    }
    foreach ($server->connections as $fd) {
        $server->push($fd, json_encode(['type' => 'msg', 'msg' => $msg]));
    }
}

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

//监听WebSocket消息事件
$server->on('message', function (swoole_websocket_server $server, $frame) use ($users) {
    broadcast($server, $frame, $users);
});

//监听WebSocket连接关闭事件
$server->on('close', function ($ser, $fd) use ($users) {
    unset($users[$fd]);
    echo "client {$fd} closed
";
});

//启动WebSocket服务器
$server->start();
ログイン後にコピー

このコード スニペットでは、すべてのオンライン ユーザーの情報を $users 配列に保存します。ユーザーがチャット ルームに参加または退出したときに、この配列を更新します。 WebSocket メッセージ イベントでは、broadcast() 関数を使用してメッセージをブロードキャストします。 WebSocket 接続の終了イベントでは、切断されたユーザーを $users 配列から削除します。

5. チャット ルームをテストする

これで、チャット ルーム アプリケーションが正常に作成されました。 Google Chrome、Firefox、Safari など、WebSocket をサポートするすべてのブラウザでテストできます。チャット ルームをテストする手順は次のとおりです。

  1. PHP コマンドを使用して上記のコードを実行します
  2. index.html ファイルをブラウザで開きます
  3. ユーザー名を入力し、[チャット ルームに入る] ボタンをクリックします。
  4. チャット ボックスにメッセージを入力し、[送信] ボタンをクリックします。

メッセージが表示されるはずです。すべてのオンライン ユーザーのチャットでボックス内でブロードキャストします。

概要

この記事では、PHP と WebSocket の統合を使用してリアルタイム チャット ルームの開発を実装する方法を紹介しました。 swoole 拡張機能を使用して WebSocket サーバーを作成し、簡単なチャット ルーム アプリケーションを作成しました。この記事では、WebSocket プロトコルを使用してリアルタイム データ送信接続を確立する方法、PHP で WebSocket サーバーを実装する方法、およびそれを使用してチャット ルーム アプリケーションを実装する方法を学習できます。

以上がPHPとWebSocketの連携でリアルタイムチャットルームの開発を実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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