Maison  >  Article  >  développement back-end  >  Fonction de retrait et de révocation des messages du système de chat en temps réel basé sur PHP

Fonction de retrait et de révocation des messages du système de chat en temps réel basé sur PHP

王林
王林original
2023-08-26 09:16:451148parcourir

Fonction de retrait et de révocation des messages du système de chat en temps réel basé sur PHP

Fonction de retrait et de révocation des messages du système de chat en temps réel basé sur PHP

Introduction :
Avec le développement rapide et la popularité d'Internet, le système de chat en temps réel est devenu un moyen important pour les gens de communiquer quotidiennement. Lors du développement d’un système de chat, la mise en œuvre de fonctions de rappel et de révocation de messages est une exigence courante. Cet article expliquera comment utiliser PHP pour écrire un système de discussion en temps réel basé sur WebSocket et implémenter des fonctions de retrait et de révocation de messages.

  1. Créer l'environnement
    Tout d'abord, nous devons configurer l'environnement PHP et le service WebSocket. Vous pouvez choisir d'utiliser un framework PHP tel que Laravel ou Symfony, ou d'utiliser directement la bibliothèque WebSocket native de PHP. Dans le framework, vous pouvez utiliser Composer pour gérer les dépendances.
  2. Créer une base de données
    Nous avons besoin d'une base de données pour stocker les messages de discussion. MySQL ou d'autres bases de données relationnelles peuvent être utilisées. Créez une table nommée chat_messages, contenant les champs suivants :
  3. id : identifiant unique du message
  4. sender_id : identifiant utilisateur de l'expéditeur
  5. receiver_id : identifiant utilisateur du destinataire
  6. message : contenu du message
  7. timestamp : heure d'envoi du message
  8. Réel -Fonction de chat en temps
    Utilisez le protocole WebSocket pour réaliser une communication en temps réel. En PHP, un serveur WebSocket peut être implémenté à l'aide de bibliothèques telles que Ratchet ou Swoole. En écoutant les messages et les événements de connexion du client, les messages sont enregistrés dans la base de données et envoyés au destinataire en temps réel.

Ce qui suit est un exemple simple utilisant la bibliothèque 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. Implémentation des fonctions de retrait et de révocation des messages
    Afin d'implémenter les fonctions de retrait et de révocation des messages, nous devons ajouter une colonne à la table de la base de données pour identifier l'état de le message. Vous pouvez ajouter un champ nommé status pour indiquer l'état du message :
  2. 1 : Normal
  3. 2 : Retrait
  4. 3 : Révoquer

Modifiez la fonction onMessage et ajoutez les paramètres du champ d'état avant d'enregistrer le message dans la base de données. :

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

implémente la fonction de retrait, qui peut envoyer l'instruction de retrait au serveur côté client, et définit le statut du message correspondant sur retiré :

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

implémente la fonction de retrait, qui peut envoyer l'instruction de retrait sur du côté client au serveur et définit le statut du message correspondant Statut défini sur retiré :

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. Traitement côté client
    Du côté client, affichez de manière appropriée si le message a été retiré ou révoqué, en fonction de l'état du message renvoyé.

Résumé :
Cet article explique comment utiliser PHP pour créer un système de discussion en temps réel basé sur WebSocket et implémenter des fonctions de retrait et de révocation de messages. Ces fonctionnalités peuvent être facilement mises en œuvre en utilisant la bibliothèque et la base de données Ratchet pour stocker et traiter les messages. Dans les projets réels, l'expansion et l'optimisation correspondantes peuvent être réalisées en fonction des besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn