Maison  >  Article  >  développement back-end  >  File d'attente de messages et traitement asynchrone du système de chat en temps réel développé avec PHP

File d'attente de messages et traitement asynchrone du système de chat en temps réel développé avec PHP

WBOY
WBOYoriginal
2023-08-26 18:55:511299parcourir

File dattente de messages et traitement asynchrone du système de chat en temps réel développé avec PHP

PHP développe une file d'attente de messages et un traitement asynchrone du système de discussion en temps réel

Dans les applications Internet modernes, le système de discussion en temps réel est devenu une fonction nécessaire. Afin de garantir le bon fonctionnement et l'expérience utilisateur du système de chat, la file d'attente des messages et la technologie de traitement asynchrone sont devenues les solutions préférées des développeurs. Dans cet article, je vais vous présenter comment développer un système de discussion en temps réel à l'aide de PHP et utiliser les files d'attente de messages et le traitement asynchrone pour améliorer les performances.

Pour implémenter le système de chat en temps réel, nous utiliserons le framework Laravel. Tout d’abord, nous devons créer un projet Laravel et installer les packages de dépendances associés. Le projet peut être créé avec la commande suivante :

composer create-project --prefer-dist laravel/laravel chat

Ensuite, nous devons installer Redis comme stockage backend pour la file d'attente des messages. Vous pouvez installer Redis en suivant les étapes suivantes :

  1. Téléchargez et décompressez Redis :

    wget http://download.redis.io/releases/redis-6.0.10.tar.gz
    tar xzf redis-6.0.10.tar.gz
    cd redis-6.0.10
  2. Compilez et installez Redis :

    make
    sudo make install
  3. Exécutez Redis :

    redis-server

Après l'installation de Redis, nous pouvons commencer à écrire du code. . Tout d'abord, nous devons créer un contrôleur nommé ChatController et ajouter le code suivant :

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesRedis;

class ChatController extends Controller
{
    public function pushMessage(Request $request)
    {
        $message = $request->input('message');

        Redis::publish('chat', json_encode([
            'message' => $message,
            'user' => $request->user()->name,
            'timestamp' => microtime(true)
        ]));

        return response()->json(['success' => true]);
    }
}

Dans le code ci-dessus, nous définissons une méthode pushMessage, qui reçoit un message et le pousse vers la file d'attente des messages Redis.

Ensuite, nous devons créer un écouteur de file d'attente appelé MessageListener. L'écouteur peut être créé par la commande suivante :

php artisan make:listener MessageListener --queued

Après la création, nous devons modifier le code suivant pour associer l'écouteur à la file d'attente de messages Redis :

<?php

namespace AppListeners;

use IlluminateContractsQueueShouldQueue;
use IlluminateQueueInteractsWithQueue;
use IlluminateSupportFacadesLog;

class MessageListener implements ShouldQueue
{
    use InteractsWithQueue;

    public function handle($message)
    {
        Log::info('New message: ' . $message);
        // 处理收到的消息,例如保存到数据库或推送给相应的用户
    }
}

Dans le code ci-dessus, nous définissons une méthode handle pour gérer les messages reçus. information. Dans cette méthode, vous pouvez effectuer le traitement de logique métier correspondant selon vos besoins.

Enfin, nous devons enregistrer l'auditeur. Dans app/Providers/EventServiceProvider.php, nous devons ajouter le code suivant : app/Providers/EventServiceProvider.php 中,我们需要添加以下代码:

protected $listen = [
    'AppEventsMessageReceived' => [
        'AppListenersMessageListener',
    ],
];

接下来,我们需要创建一个名为EventSubscriber的事件订阅器。可以通过以下命令来创建订阅器:

php artisan make:subscriber EventSubscriber

创建后,我们需要添加以下代码来定义推送消息事件:

<?php

namespace AppSubscribers;

use AppEventsMessageReceived;
use IlluminateSupportFacadesEvent;

class EventSubscriber
{
    public function handle(MessageReceived $event)
    {
        Event::fire('AppEventsMessageReceived', [$event->message]);
    }

    public function subscribe($events)
    {
        $events->listen(
            'AppEventsMessageReceived',
            'AppListenersMessageListener@handle'
        );
    }
}

在上述代码中,我们定义了handle方法和subscribe方法来处理推送消息事件。

最后,我们需要将事件订阅器注册到Laravel中。在 app/Providers/EventServiceProvider.php

protected $subscribe = [
    'AppSubscribersEventSubscriber',
];

Ensuite, nous devons créer un abonné à l'événement appelé EventSubscriber. Les abonnés peuvent être créés via la commande suivante :

$.ajax({
    url: '/push-message',
    type: 'POST',
    data: { message: 'Hello world' },
    success: function(response) {
        console.log(response);
    }
});

Après la création, nous devons ajouter le code suivant pour définir les événements de message push :

rrreee

Dans le code ci-dessus, nous définissons la méthode handle et la méthode d'abonnement pour gérer les événements de message push. 🎜🎜Enfin, nous devons enregistrer l'abonné à l'événement dans Laravel. Dans app/Providers/EventServiceProvider.php, nous devons modifier le code suivant : 🎜rrreee🎜Après avoir terminé les étapes ci-dessus, nous pouvons envoyer des messages au serveur via Ajax dans le code front-end. Voici un exemple simple : 🎜rrreee🎜En utilisant des files d'attente de messages et une technologie de traitement asynchrone, nous pouvons considérablement améliorer les performances et l'expérience utilisateur des systèmes de discussion en temps réel. J'espère que cet article vous aidera à mieux comprendre et appliquer ces techniques. 🎜

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