Heim  >  Artikel  >  Backend-Entwicklung  >  Funktion zum Zurückziehen und Widerrufen von Nachrichten eines auf PHP basierenden Echtzeit-Chat-Systems

Funktion zum Zurückziehen und Widerrufen von Nachrichten eines auf PHP basierenden Echtzeit-Chat-Systems

王林
王林Original
2023-08-26 09:16:451149Durchsuche

Funktion zum Zurückziehen und Widerrufen von Nachrichten eines auf PHP basierenden Echtzeit-Chat-Systems

Funktion zum Zurückziehen und Widerrufen von Nachrichten eines auf PHP basierenden Echtzeit-Chat-Systems

Einführung:
Mit der rasanten Entwicklung und Beliebtheit des Internets ist das Echtzeit-Chat-System zu einem wichtigen Kommunikationsmittel für Menschen im täglichen Leben geworden . Bei der Entwicklung eines Chat-Systems ist die Implementierung von Funktionen zum Abrufen und Widerrufen von Nachrichten eine häufige Anforderung. In diesem Artikel wird erläutert, wie Sie mit PHP ein auf WebSocket basierendes Echtzeit-Chat-System schreiben und Funktionen zum Zurückziehen und Widerrufen von Nachrichten implementieren.

  1. Erstellen Sie die Umgebung
    Zuerst müssen wir die PHP-Umgebung und den WebSocket-Dienst einrichten. Sie können ein PHP-Framework wie Laravel oder Symfony verwenden oder direkt die native WebSocket-Bibliothek von PHP verwenden. Im Framework können Sie Composer zum Verwalten von Abhängigkeiten verwenden.
  2. Datenbank erstellen
    Wir benötigen eine Datenbank zum Speichern von Chatnachrichten. Es können MySQL oder andere relationale Datenbanken verwendet werden. Erstellen Sie eine Tabelle mit dem Namen chat_messages, die die folgenden Felder enthält:
  3. id: eindeutige Kennung der Nachricht
  4. sender_id: Benutzer-ID des Absenders
  5. receiver_id: Benutzer-ID des Empfängers
  6. message: Nachrichteninhalt
  7. timestamp: Nachricht senden Zeit
  8. Echtzeit-Chat-Funktion
    Verwenden Sie das WebSocket-Protokoll, um Echtzeitkommunikation zu realisieren. In PHP kann ein WebSocket-Server mithilfe von Bibliotheken wie Ratchet oder Swoole implementiert werden. Durch das Abhören der Nachrichten und Verbindungsereignisse des Clients werden die Nachrichten in der Datenbank gespeichert und in Echtzeit an den Empfänger gesendet.

Das Folgende ist ein einfaches Beispiel unter Verwendung der Ratchet-Bibliothek:

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. Implementieren von Funktionen zum Zurückziehen und Widerrufen von Nachrichten
    Um Funktionen zum Zurückziehen und Widerrufen von Nachrichten zu implementieren, müssen wir der Datenbanktabelle eine Spalte hinzufügen, um den Status von zu identifizieren die Nachricht. Sie können ein Feld mit dem Namen Status hinzufügen, um den Status der Nachricht anzuzeigen:
  2. 1: Normal
  3. 2: Zurückziehen
  4. 3: Widerrufen

Ändern Sie die onMessage-Funktion und fügen Sie die Einstellungen des Statusfelds hinzu, bevor Sie die Nachricht speichern die Datenbank. :

$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();

implementiert die Auszahlungsfunktion, die die Auszahlungsanweisung an den Server auf der Clientseite senden kann, und setzt den entsprechenden Nachrichtenstatus auf zurückgezogen:

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;
        }
    }
}

implementiert die Auszahlungsfunktion, die die Auszahlungsanweisung weiterleiten kann Die Clientseite wird an den Server gesendet und der entsprechende Nachrichtenstatus wird auf „Zurückgezogen“ gesetzt:

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;
        }
    }
}
  1. Clientseitige Verarbeitung
    Auf der Clientseite wird basierend auf dem zurückgegebenen Nachrichtenstatus entsprechend angezeigt, ob die Nachricht zurückgezogen oder widerrufen wurde.

Zusammenfassung:
In diesem Artikel wird erläutert, wie Sie mit PHP ein Echtzeit-Chat-System basierend auf WebSocket erstellen und Funktionen zum Zurückziehen und Widerrufen von Nachrichten implementieren. Diese Funktionen können einfach implementiert werden, indem die Ratchet-Bibliothek und -Datenbank zum Speichern und Verarbeiten von Nachrichten verwendet wird. In konkreten Projekten können entsprechende Erweiterungen und Optimierungen je nach Bedarf durchgeführt werden.

Das obige ist der detaillierte Inhalt vonFunktion zum Zurückziehen und Widerrufen von Nachrichten eines auf PHP basierenden Echtzeit-Chat-Systems. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn