Systéme de chat

a marqué ce sujet comme résolu.

Bonjour j’ai dévéloppé mon site dans lequel ce trouve un systéme de chat. Tout fonctionne bien mais j’ai quelque question à poser:

Voici comment mon systéme fonctionne:

  • Il y a une réquête ajax qui est lancé chaque 1 séconde il est chargé de verifier si il y a un nouveau message et de l’envoyé a l’utilisateur

Ma question est que si je commence à avoir par exemple 1000 voir 10000 utilisateurs connectés sur mon site

est-ce que cette maniere de faire ne vas pas ralentir mon systéme ?

Existe t-il une maniere plus efficace de le faire?

Toutes vos réponses et suggestions sont la bienvenu. Merci a vous.

+0 -0

Effectivement, tu risques de mettre ton serveur à genoux avec la méthode AJAX s’il y a 10000 utilisateurs en même temps. WebSocket pourrait bien être ce que tu cherches.

Si, pour une raison ou pour une autre, tu ne peux pas mettre en oeuvre des WS, il y a des petits hacks possibles. Par exemple si les messages du chat sont sur une BDD SQL, les décharger sur un Redis ou sur un fichier statique contenant les messages, qui est mis à jour toutes les X secondes. (servir 10000 fois un fichier statique c’est rien sur un serveur moderne). J’ai eu l’occasion de mettre en place ce genre de bidouilles dans l’une de mes anciennes boîtes. J’ai été étonné de voir que ça marchait mieux que ce que je pensais.

Mais, si tu peux utiliser des WS, utilise des WS.

+1 -0

En utilisant ajax comme tu le fais, le serveur n’a aucun moyen de dire au client qu’il y a un nouveau message, d’où le fait que le client de demander continuellement si c’est le cas.

Les websockets permettent d’établire une communication bi-directionelle, c’est à dire que non seulement le client peut envoyer un message au serveur, mais le serveur peut aussi envoyer un message au client. Le client peut donc se contenter d’attendre que le serveur lui dise qu’il y a un nouveau message au lieux de devoir continuellement le demander au serveur.

Je vois que c’est difficile de trouver une documantation sur ces websockets.

Puis-je avoir des liens ?

watanga96

Oui, ici : https://socket.io.

Socket.io c’est la bibliothèque par excellence pour intégrer les websockets facilement et rendre le bousin compatible avec tous les navigateurs.

Edit : puis le tuto qui va bien : https://www.tutorialspoint.com/socket.io/index.htm.

+0 -0

Il y avait le pulling en PHP (on garde la requête PHP côté serveur avec une boucle, on vérifie chaque X secpnde s’il y a un changement pour envoyer la requête) mais je ne trouve plus aucun contenu la dessus, il me semble que les WS ont pris le dessus.

connectionsql()
<?php
while (!get('SELECT changement FROM table')) {
   deconnectionsql()
   sleep(500)
   connectionsql()
}

echo "nouveaux messages :" . chat()

Il y avait le pulling en PHP (on garde la requête PHP côté serveur avec une boucle, on vérifie chaque X secpnde s’il y a un changement pour envoyer la requête) mais je ne trouve plus aucun contenu la dessus, il me semble que les WS ont pris le dessus.

A-312

Tu ne veux pas plutôt parler de server push, streaming ou long polling ?

Bonjour j’ai implementer le long pooling de cette façon:

Côté client :

function check_new_message(){
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'controller/new_message.php', true);
  xhr.timeout = 30000;

  xhr.onreadystatechange = function(){
      if(xhr.readyState == 4 && xhr.status == 200){
        // request treatment
        
        check_new_message();
      }
  };

  xhr.ontimeout = function(){
       check_new_message();
    };
    
    xhr.send(null);
}

Côté serveur :

$number = 0;
set_time_limit(60);
    
while(true){
  // treatment
      
  if($number != 0){
            echo $number;
            break;
    }
    else{
            sleep(1);
            continue;
    }
}

Je ne sais pas si j’ai fait une erreur mais lorsque ces codes tournent je n’arrive même pas a faire une opération sur le site.

Les pages du n’arrivent pas à ce charger.

Merci pour toutes vos réponses.

+0 -0

Je ne sais pas si j’ai fait une erreur mais lorsque ces codes tournent je n’arrive même pas a faire une opération sur le site.

watanga96

C’est normal, ton navigateur et le serveur limite le nombre de requêtes HTTP(S) simultanées. D’où l’importance de maintenir un socket ouvert plutôt que de requêter sur un script distant. D’autant que ça ne répond pas à ta problématique de départ : ton serveur Apache2 va rapidement atteindre sa limite d’utilisateurs et PHP n’en parlons même pas …

A la limite pour que ce soit plus rapide sans passer par les sockets, tu peux séparer la lecture de l’écriture. En écriture, tu appelles un script PHP pour ajouter à la liste d’un fichier la date, le contenu du message, le pseudo et un hash md5 de l’ensemble (faut penser à verrouiller le fichier pour garder l’intégrité). Puis en lecture tu récupères directement le fichier, sans passer par PHP en ajoutant une règle dans le htaccess. Côté JS, tu gardes en mémoire le dernier hash récupéré et tu repars de là pour ajouter les nouveaux messages.

Exemple :

d4a261beeaffe32bc4fff43f1f5cfaeb 2020-02-02T09:40:00.000Z "Yarflam" Bonjour les gens !
9addea35dc22e43f33d9594f56096ba8 2020-02-02T09:45:00.000Z "watanga96" Bonjour ! :)
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte