IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

mini chat, gestion message multi-users


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité2
    Invité(e)
    Par défaut mini chat, gestion message multi-users
    Re-bonjour,

    J'ai fais un chat tout simple en php/ajax.
    J'aimerais le transformer en multi utilisateurs.
    Je ne vois pas trop comment gérer les messages en mode multi users car dans le chat tout simple, il suffit d'aller chercher tous les messages. Dans le cas du multi users, il faut ajouter un champ "conversation"(c'est un exemple) à la table "messages"
    Je peux créer une table "conversation" avec les noms des utilisateurs concernés.

    Et après ? je fais comment pour mettre a jour les fenetres de chat ?
    - Chaque fenetre ouverte a l'id de la conversation ?
    - Quel genre de requete faut il envoyer pour savoir si quelqu'un commence une nouvelle discussion avec quelqu'un d'autre ?

    Je ne sais pas si je suis clair là....

    des idées ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Deux solution:
    - soit tu prends ajaxIm et tu te casse pas la tête
    - soit tu réalise une structure de bdd qui ressemble à ça:


    Pour la mise à jour, c'est assez simple, tu envoies toutes les x millisecondes un XHR vers un web service PHP qui interroge "messages_has_recipients" pour obtenir les id des nouveaux messages (status read à false) pour un recipient donné. Et tu vas chercher les messages avec un autre webservice (tous les message d'un coup bien entendu). Tu fais transiter tout ça avec du JSon et ça roule tout seul :p

    Après, pour éviter que la table de messages ne grossisse trop, tu colles un cronjob qui est chargé de supprimer toutes les entrées de messages qui dépassent un certain timestamp (par exemple, message de plus de 20 minutes) ou bien tu les archives dans une table d'archivage.
    Images attachées Images attachées  

  3. #3
    Invité2
    Invité(e)
    Par défaut
    merci,

    Je vais étudier ton schéma.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Voici la représentation MySQL du schéma:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
     
    CREATE SCHEMA IF NOT EXISTS `chat` DEFAULT CHARACTER SET utf8 ;
    USE `chat` ;
     
    -- -----------------------------------------------------
    -- Table `chat`.`conversation`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `chat`.`conversation` (
      `id` BIGINT(25) NOT NULL ,
      `name` VARCHAR(45) NOT NULL ,
      `password` VARCHAR(45) NULL ,
      PRIMARY KEY (`id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `chat`.`users`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `chat`.`users` (
      `id` BIGINT(25) NOT NULL ,
      `name` VARCHAR(45) NOT NULL ,
      `users_id` BIGINT(25) NOT NULL ,
      PRIMARY KEY (`id`) )
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `chat`.`messages`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `chat`.`messages` (
      `id` BIGINT(25) NOT NULL ,
      `conversation_id` BIGINT(25) NULL ,
      `body` VARCHAR(250) NOT NULL ,
      `time` BIGINT(25) NOT NULL ,
      `author` BIGINT(25) NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX `fk_messages_conversation1` (`conversation_id` ASC) ,
      INDEX `fk_messages_users1` (`author` ASC) ,
      CONSTRAINT `fk_messages_conversation1`
        FOREIGN KEY (`conversation_id` )
        REFERENCES `chat`.`conversation` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_messages_users1`
        FOREIGN KEY (`author` )
        REFERENCES `chat`.`users` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
    -- -----------------------------------------------------
    -- Table `chat`.`messages_has_recipients`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `chat`.`messages_has_recipients` (
      `messages_id` BIGINT(25) NOT NULL ,
      `users_id` BIGINT(25) NOT NULL ,
      `read` TINYINT(1)  NOT NULL DEFAULT FALSE ,
      PRIMARY KEY (`messages_id`, `users_id`) ,
      INDEX `fk_messages_has_users_users1` (`users_id` ASC) ,
      INDEX `fk_messages_has_users_messages1` (`messages_id` ASC) ,
      CONSTRAINT `fk_messages_has_users_messages1`
        FOREIGN KEY (`messages_id` )
        REFERENCES `chat`.`messages` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_messages_has_users_users1`
        FOREIGN KEY (`users_id` )
        REFERENCES `chat`.`users` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
     
     
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Si ça peut servir...

  5. #5
    Invité2
    Invité(e)
    Par défaut
    Merci, mais j'arrive un peu tard, j'ai déjà effectué le plus gros du travail.

    J'ai crée deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TABLE IF NOT EXISTS `chat_messages` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `talkId` int(11) NOT NULL,
      `message` varchar(255) NOT NULL,
      `date` bigint(60) NOT NULL,
      `fromUser` varchar(60) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    CREATE TABLE IF NOT EXISTS `chat_talk` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `users` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    je n'ai pas vraiment respecté vos conseils mais j'essaye d’alléger le code et surtout les requêtes au maximum.

    Il ne me reste plus qu'a finir ma fonction pour récupérer les messages. Et je galère avec les tableaux.

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Plusieurs remarques:
    - le champ date s'apparente plus à un timestamp, tu devrais le renommer.
    - le champ fromUser devrait être une clé étrangère ciblant le champ id de la table users
    - le champ users de chat_talk est absolument immonde. Enlève-moi ça et mets une relation n-m entre users et chat_talk.

    De plus
    - Quel est l'intérêt de mettre ces tables en MyIsam ? On perds la sécurité en plus.
    - Quels sont les problèmes de requêtes que tu rencontres ?

    je n'ai pas vraiment respecté vos conseils mais j'essaye d’alléger le code et surtout les requêtes au maximum.
    Bien au contraire, avec une structure pareille tu alourdis considérablement les requêtes et d'une part tu dégrade les performances d'autre part tu augmente la mémoire physique occupée par les tables en en respectant pas les formes normales.

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/02/2015, 11h31
  2. [Développement] Application multi user
    Par Vesta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/04/2006, 23h52
  3. VBA-E] Mots de passe multi-users
    Par Igloobel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/10/2005, 22h09
  4. Design d'une base multi-user
    Par Aurelien.Regat-Barrel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/08/2005, 13h13
  5. Réponses: 2
    Dernier message: 14/03/2004, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo