ホームページ >バックエンド開発 >PHPチュートリアル >PHPベースのリアルタイムチャットシステムのメッセージ取消・取消し機能

PHPベースのリアルタイムチャットシステムのメッセージ取消・取消し機能

王林
王林オリジナル
2023-08-26 09:16:451202ブラウズ

PHPベースのリアルタイムチャットシステムのメッセージ取消・取消し機能

PHP ベースのリアルタイム チャット システムのメッセージの撤回および取り消し機能

はじめに:
インターネットの急速な発展と普及により、リアルタイムチャット システムは日常の重要なコミュニケーション手段となっています。チャット システムを開発する場合、メッセージの取り消しおよび取り消し機能の実装は一般的な要件です。この記事では、PHP を使用して WebSocket ベースのリアルタイム チャット システムを作成し、メッセージの取り消しと取り消し機能を実装する方法を紹介します。

  1. 環境の構築
    まず、PHP 環境と WebSocket サービスをセットアップする必要があります。 Laravel や Symfony などの PHP フレームワークを使用するか、PHP のネイティブ WebSocket ライブラリを直接使用するかを選択できます。フレームワークでは、Composer を使用して依存関係を管理できます。
  2. データベースの作成
    チャット メッセージを保存するデータベースが必要です。 MySQL またはその他のリレーショナル データベースを使用できます。次のフィールドを含む chat_messages という名前のテーブルを作成します。
  3. id: メッセージの一意の識別子
  4. sender_id: 送信者のユーザー ID
  5. receiver_id: メッセージのユーザー受信者ID
  6. message: メッセージ内容
  7. timestamp: メッセージ送信時刻
  8. リアルタイムチャット機能
    WebSocketプロトコルを使用し、リアルタイム通信を実現します。 PHP では、Ratchet や Swoole などのライブラリを使用して WebSocket サーバーを実装できます。クライアントのメッセージと接続イベントをリッスンすることにより、メッセージはデータベースに保存され、リアルタイムで受信者に送信されます。

次に、Ratchet ライブラリを使用した簡単な例を示します。

require 'vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;

class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        // 解析接收到的消息
        $data = json_decode($msg, true);

        // 将消息保存到数据库
        $message = new ChatMessage();
        $message->sender_id = $data['sender_id'];
        $message->receiver_id = $data['receiver_id'];
        $message->message = $data['message'];
        $message->timestamp = time();
        $message->save();

        // 将消息发送给接收者
        foreach ($this->clients as $client) {
            if ($client !== $from && $client->resourceId == $data['receiver_id']) {
                $client->send($data['message']);
                break;
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        $conn->close();
    }
}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);

$server->run();
  1. メッセージの取り消しと取り消し機能の実装
    メッセージの取り消しと取り消し機能を実装するには、データベースにメッセージの取り消しと取り消しの機能を実装する必要があります。メッセージのステータスを識別するためにテーブルに列を追加します。 status という名前のフィールドを追加して、メッセージのステータスを示すことができます:
  2. 1: Normal
  3. 2: Withdrawn
  4. 3: Withdrawn
  5. onMessage 関数を変更し、メッセージをデータベースに保存する前にステータス フィールドの設定を追加します。
$message = new ChatMessage();
$message->sender_id = $data['sender_id'];
$message->receiver_id = $data['receiver_id'];
$message->message = $data['message'];
$message->timestamp = time();
$message->status = 1; // 设置消息状态为正常
$message->save();

引き出し機能を実装するには、クライアントはサーバーに引き出し指示を送信し、対応するメッセージ ステータスを設定します。取り消しへ:

public function onMessage(ConnectionInterface $from, $msg) {
    // 解析接收到的消息
    $data = json_decode($msg, true);

    // 根据消息ID更新状态为撤回
    ChatMessage::where('id', $data['message_id'])
        ->update(['status' => 2]);

    // 广播撤回消息给接收者
    $this->broadcastMessage($data['message_id'], $from, $data['receiver_id']);
}

public function broadcastMessage($messageId, ConnectionInterface $from, $receiverId) {
    foreach ($this->clients as $client) {
        if ($client !== $from && $client->resourceId == $receiverId) {
            $client->send(json_encode(['action' => 'revoke', 'message_id' => $messageId]));
            break;
        }
    }
}

取り消し機能を実装するには、クライアント側のサーバーに取り消し指示を送信し、対応するメッセージ ステータスを取り消しに設定します:

public function onMessage(ConnectionInterface $from, $msg) {
    // 解析接收到的消息
    $data = json_decode($msg, true);

    // 根据消息ID更新状态为撤销
    ChatMessage::where('id', $data['message_id'])
        ->update(['status' => 3]);

    // 广播撤销消息给接收者
    $this->broadcastMessage($data['message_id'], $from, $data['receiver_id']);
}

public function broadcastMessage($messageId, ConnectionInterface $from, $receiverId) {
    foreach ($this->clients as $client) {
        if ($client !== $from && $client->resourceId == $receiverId) {
            $client->send(json_encode(['action' => 'revoke', 'message_id' => $messageId]));
            break;
        }
    }
}

Client処理
    クライアント側では、返されたメッセージのステータスに基づいて、メッセージが取り下げられたか取り消されたかを適切に表示します。

  1. 概要:
この記事では、PHP を使用して WebSocket ベースのリアルタイム チャット システムを構築し、メッセージの取り消しと取り消し機能を実装する方法を紹介します。これらの機能は、Ratchet ライブラリとデータベースを使用してメッセージを保存および処理することで簡単に実装できます。実際のプロジェクトでは、ニーズに応じて対応する拡張や最適化を行うことができます。

以上がPHPベースのリアルタイムチャットシステムのメッセージ取消・取消し機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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