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 :

Comet - Chat


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Points : 64
    Points
    64
    Par défaut Comet - Chat
    Bonjour,

    j'essaye actuellement de mettre en place un chat en utilisant comet.
    J'ai utilisé le code suivant, qui marche très bien : http://www.zeitoun.net/articles/comet_and_php/start
    Les messages sont stockés dans un fichier data.txt
    Or, je voudrais pouvoir spécifier le nom du fichier dans lequel sont enregistrés les messages. Je passe ce nom dans l'url, et je le récupère dans backend.php

    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
    <?php
     
     
    // store new message in the file
    $msg = isset($_GET['msg']) ? $_GET['msg'] : '';
    $usr = isset($_GET['usr']) ? $_GET['usr'] : '';
     
    //Je récupère ici le nom du fichier a utiliser
    $file = isset($_GET['file']) ? $_GET['file'] : '';
     
    $concept = 'test';
    $filename  = dirname(__FILE__).$file.'.txt';
     
    if ($msg != '')
    {
      $date = date('H:i:s'); 
      $msg = $usr . $concept . $date . " : " . $user . $msg . "\n";
      file_put_contents($filename,$msg, FILE_APPEND);
      die();
    }
     
    // infinite loop until the data file is not modified
    $lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
    $currentmodif = filemtime($filename);
    while ($currentmodif <= $lastmodif) // check if the data file has been modified
    {
      usleep(1000000); // sleep 10ms to unload the CPU
      clearstatcache();
      $currentmodif = filemtime($filename);
    }
     
    // return a json array
    $response = array();
    $file = file_get_contents($filename);
    $splited = explode("\n", $file);
    $size = count($splited);
    $response['msg']       = $splited[$size - 2];
    $response['timestamp'] = $currentmodif;
    echo json_encode($response);
    flush();
     
    /* filename: backend.php */
    Le problème, c'est que quand j'utilise la variable venant de l'URL, mon chat ne s'affiche plus. En effet, la méthode handleResponse() n'est plus appellé dans ma partie Javascript.
    Les messages sont écris dans le fichier que j'ai passé dans l'url, mais ça s'arrête la.
    Si dans backend.php, je définis $file en dur, tout se passe bien.

    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
    // comet implementation
    var Comet = function (data_url) {
      this.timestamp = 0;
      this.url = data_url;  
      this.noerror = true;
     
      this.connect = function() {
        var self = this;
     
        $.ajax({
          type : 'get',
          url : this.url,
          dataType : 'json', 
          data : {'timestamp' : self.timestamp},
          success : function(response) {
            self.timestamp = response.timestamp;
            self.handleResponse(response);
            self.noerror = true;          
          },
          complete : function(response) {
            // send a new ajax request when this request is finished
            if (!self.noerror) {
              // if a connection problem occurs, try to reconnect each 5 seconds
              setTimeout(function(){ comet.connect(); }, 5000);           
            }else {
              // persistent connection
              self.connect(); 
            }
     
            self.noerror = false; 
          }
        });
      }
     
      this.disconnect = function() {}
     
      this.handleResponse = function(response) {
        $('#chatContent').append('<div>' + response.msg + '</div>');
      }
     
      this.doRequest = function(request, usr, file) {
          $.ajax({
            type : 'get',
            url : this.url,
            data : {'msg' : request, 'usr' : usr, 'file' : file}
          });
      }
     
    }
     
     
    var comet = new Comet('./chat/backend.php');
    comet.connect();
    En fait c'est vraiment quand je récupère le nom du fichier par $_GET[] que ça ne marche pas (j'écris dans le fichier, mais pas de retour dans le Javascript).
    Est-ce que quelqu'un aurait une idée de la direction dans laquelle je pourrais chercher ?

    Merci d'avance

    Sebastian

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Points : 25
    Points
    25
    Par défaut
    à mon avis c'est que tu ne passes pas le nom du fichier dans l'appel initial:

    essaye avec
    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
     
    var Comet = function (data_url, chat_file) {
    $.ajax({
          type : 'get',
          url : this.url,
          dataType : 'json', 
          data : {timestamp : self.timestamp, file: chat_file},
          success : function(response) {
            self.timestamp = response.timestamp;
            self.handleResponse(response);
            self.noerror = true;          
          }
     
    ...
     
    var comet = new Comet('./chat/backend.php', 'messages.txt');
    comet.connect();
    et dans le php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $filename  = dirname(__FILE__).basename($file).'.txt';

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Points : 64
    Points
    64
    Par défaut
    Merci pour ta réponse MartyMacFly.
    Je ne pense pas que le problème se situe à ce niveau là: en effet, quand je passe le nom du fichier dans l'url, le message est effectivement écrit dans ce fichier !
    Le problème étant que même si j'écris dans le fichier en question, la méthode handleResponse du JS n'est jamais appelée. J'ai plutôt l'impression qu'il s'agit d'un problème au niveau de la détection de modification du fichier (filemtime), mais je vois pas comment le résoudre ...

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Points : 64
    Points
    64
    Par défaut
    Alors en fait j'ai l'impression que filemtime se fait pas sur le bon nom de fichier, mais sur un nom de fichier qu'il récupère sans doute quelque part en cache.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ($currentmodif <= $lastmodif) // check if the data file has been modified
    {
      usleep(1000000); // sleep 10ms to unload the CPU
      clearstatcache();
      $currentmodif = filemtime($filename);
    }
    Je me retrouve dans avec des warning dans php_error.log de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [13-May-2012 13:34:42] PHP Warning:  filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for chat.html in /Applications/MAMP/htdocs/azertyuio/trunk/chat/backend.php on line 27
    En fait, j'ai l'impression qu'il fait le filemtime sur un nom de fichier qui ne correspond pas au nom de fichier que je récupère en GET.
    Un problème de race condition peut-être ?
    Est-ce possible qu'il execute cette boucle while, avant que $filename soit initialisé avec la variable récupéré dans l'url ?

Discussions similaires

  1. [Flash] Chat irc ?
    Par Skorps dans le forum Flash
    Réponses: 9
    Dernier message: 13/10/2008, 00h55
  2. chat en Comet
    Par archeboc dans le forum Autres langages pour le Web
    Réponses: 0
    Dernier message: 30/07/2008, 16h22
  3. Réaliser un Chat avec support IP
    Par Sub0 dans le forum Développement
    Réponses: 12
    Dernier message: 14/07/2006, 10h59
  4. dev d'un chat
    Par billyboy dans le forum Développement
    Réponses: 2
    Dernier message: 11/10/2003, 20h18
  5. [TP]Création d'un Chat en Pascal!
    Par Sub0 dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 12/06/2003, 19h58

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