PHP ベースのリアルタイム チャット システムのチャット ルームおよびオンライン ゲーム機能
インターネット技術の継続的な発展と普及により、リアルタイム コミュニケーションが一般的なものになりました。人々の生活に欠かせないもの、欠けているもの。その重要な部分として、リアルタイム チャット システムはさまざまなオンライン ソーシャル プラットフォームや Web サイトで広く使用されています。この記事では、PHP をベースにしたリアルタイム チャット システムと、チャット ルームやオンライン ゲーム機能の追加方法を紹介します。
リアルタイム チャット システムの鍵は、ユーザーがシステム内でリアルタイムにメッセージを送受信できるようにインスタント メッセージング機能を実装できることです。 PHP では、WebSocket テクノロジーを使用してリアルタイム通信を実現できます。 WebSocket は、単一の TCP 接続を介した全二重通信用のプロトコルであり、サーバーに過度の負担をかけずに永続的な接続を提供できます。
まず、リアルタイム メッセージの送受信を処理する WebSocket サーバーを作成する必要があります。以下は簡単な PHP コードの例です。
<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501); // 监听 WebSocket 连接打开事件 $server->on('open', function (SwooleWebSocketServer $server, $request) { echo "客户端 {$request->fd} 进入聊天室 "; }); // 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) { echo "收到客户端消息:{$frame->data} "; // 将消息发送给所有连接的客户端 foreach ($server->connections as $fd) { $server->push($fd, $frame->data); } }); // 监听 WebSocket 连接关闭事件 $server->on('close', function ($ser, $fd) { echo "客户端 {$fd} 离开聊天室 "; }); // 启动 WebSocket 服务器 $server->start(); ?>
上記のコードでは、Swoole 拡張機能を使用して WebSocket サーバーを作成します。新しいクライアントが接続すると、open
イベントがトリガーされます。クライアントがメッセージを送信すると、message
イベントがトリガーされます。クライアントが接続を閉じると、# がトリガーされます。 ##閉じるイベント。これらのイベントのコールバック関数で対応する処理を実行できます。
<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501); // 在线用户列表 $onlineUsers = []; // 监听 WebSocket 连接打开事件 $server->on('open', function (SwooleWebSocketServer $server, $request) use (&$onlineUsers) { echo "客户端 {$request->fd} 进入聊天室 "; // 将用户添加到在线用户列表 $onlineUsers[$request->fd] = $request->fd; }); // 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) { echo "收到客户端消息:{$frame->data} "; $data = json_decode($frame->data, true); // 判断消息类型 switch ($data['type']) { case 'message': // 将消息发送给所有连接的客户端 foreach ($onlineUsers as $fd) { $server->push($fd, json_encode([ 'type' => 'message', 'username' => $data['username'], 'content' => $data['content'], ])); } break; case 'private_message': // 私聊功能 $receiver = $data['receiver']; $content = $data['content']; // 判断接收者是否在线 if (isset($onlineUsers[$receiver])) { $server->push($receiver, json_encode([ 'type' => 'private_message', 'sender' => $frame->fd, 'content' => $content, ])); } else { // 如果接收者不在线,则提示发送失败 $server->push($frame->fd, json_encode([ 'type' => 'error', 'content' => '发送失败,接收者不在线!', ])); } break; } }); // 监听 WebSocket 连接关闭事件 $server->on('close', function ($ser, $fd) use (&$onlineUsers) { echo "客户端 {$fd} 离开聊天室 "; // 将用户从在线用户列表中移除 unset($onlineUsers[$fd]); }); // 启动 WebSocket 服务器 $server->start(); ?>
fd を保存するために
$onlineUsers 配列を追加しました。新しいユーザーが接続すると、その
fd が配列に追加され、ユーザーが切断すると、配列から削除されます。また、メッセージ イベントには、メッセージ タイプを決定するロジックを追加しました。プライベート チャット メッセージの場合は、プライベート チャットのコンテンツが受信者に送信され、そうでない場合は、接続されているすべてのクライアントにチャットのコンテンツがブロードキャストされます。
// 监听 WebSocket 消息事件 $server->on('message', function (SwooleWebSocketServer $server, $frame) use (&$onlineUsers) { echo "收到客户端消息:{$frame->data} "; $data = json_decode($frame->data, true); // 判断消息类型 switch ($data['type']) { ... case 'guess_number': // 猜数字游戏 $numbers = range(1, 10); $answer = array_rand($numbers); if ($data['number'] == $answer) { $server->push($frame->fd, json_encode([ 'type' => 'guess_number', 'result' => '猜对了!', ])); } else { $server->push($frame->fd, json_encode([ 'type' => 'guess_number', 'result' => '猜错了!答案是' . $answer, ])); } break; } });
guess_number メッセージ タイプを追加しました。クライアントが数字を推測するメッセージを送信すると、サーバーはランダムな回答を生成し、それをクライアントの推測と比較し、結果をクライアントに返します。
以上がチャット ルームとオンライン ゲーム機能を備えた PHP ベースのリアルタイム チャット システムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。