chat php / ajax

Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

suppr_18032010
 

chat php / ajax

Message le Dim Juil 02, 2006 14:09

Bonjour à tous,

J'ai un probleme avec un de mes scripts pour un chat en php/ajax.
Cela fonctionne parfaitement avec firefox mais pas avec explorer : la page des messages ne se recharge pas sous IE (elle doit se recharger toutes les 200ms) ...

Code: Tout sélectionner
...
<script type='text/JavaScript'>
var xhr = null;
var n=0;
function getXhr(){
    if(window.XMLHttpRequest)xhr = new XMLHttpRequest();
   else if(window.ActiveXObject){
        try{
           xhr = new ActiveXObject("Msxml2.XMLHTTP");
        }catch (e){
           xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
     }else{
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
        xhr = false;
     }
}
function init(){
   loop();
}
function loop(){
   //setTimeout('loop();',200);
   setTimeout("mainLoop()",200);// recharge les messages
   ShowPage();
}
function ShowPage(){
   getXhr();
   xhr.onreadystatechange = function(){
      if(xhr.readyState == 4 && xhr.status == 200){
         document.getElementById('page1').innerHTML=xhr.responseText;
        }
    }
   xhr.open("GET","loop.php",true);// page des messages
   xhr.send(null);
}
</script>
</head>
<body onLoad="init()">
...


est ce que quelqu'un voit d'ou cela peut venir ?

Merci a tous

Xp

Dmx
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 7 Avr 2004

Message le Dim Juil 02, 2006 16:12

oui c'est là l'erreur :
xhr.open("GET","loop.php",true);// page des messages

problème de cache ;) IE reprends le fichier en cache, soit tu met sur ton script php un header pour indiquer au navigateur qu'il ne faut pas de cache

soit t'appelles
xhr.open("GET","loop.php?20060702171349",true);// page des messages

le numéro correspond a la date courante ;) (avec les milisecondes dans ton cas !)

Si ton script est au point j'en veux bien une copie, je m'en ferai un plaisir de l'améliorer et de le redistribué ;)

suppr_18032010
 

Message le Dim Juil 02, 2006 16:57

merci de ta reponse...

j'avais deja essayé :
Code: Tout sélectionner
<script type="text/javascript" language="javascript">
var xhr = null;
var n=0;
function getXhr(){
    if(window.XMLHttpRequest){
       xhr = new XMLHttpRequest();
   }else if(window.ActiveXObject){
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
     }else{
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
        xhr = false;
     }
}
function init(){
   loop();
}
function loop(){
   setTimeout('loop();',5000);
   ShowPage();
}
function ShowPage(){
   getXhr();
   xhr.onreadystatechange = function(){
       if(xhr.readyState == 4 && xhr.status == 200){
         document.getElementById('page1').innerHTML=xhr.responseText;
       }
    }
   xhr.open("GET","loop.php?<? echo time(); ?>",true);
   xhr.send(null);
}
</script>


mais cela permet juste de recharger la page correctement sous IE si on rafraichi (touche F5)

cela ne recharge pas automatiquement le contenu des messages puisque le time(); est en javascript dans la page...

Xele
WRInaute discret
WRInaute discret
 
Messages: 109
Inscription: 10 Juil 2005

Message le Dim Juil 02, 2006 19:56

Suffit de fabriquer le time avec javascript, forcement s'il est en php il va pas bouger beaucoup :lol:

suppr_18032010
 

Message le Dim Juil 02, 2006 22:04

en fait DMX avait raison :

Code: Tout sélectionner
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

pour empecher le cache IE et ca marche... sur Firefox et IE

mon chat est un peu spécial car seul les membres (identifiés via un cookie) peuvent y accéder, sans besoin de se s'identifier une nouvelle fois
les visiteurs ne peuvent que voir les messages et doivent s'enregistrer sur le site pour participer
si ca t'interesse, je peux poster les fichiers...

DaMonkey
WRInaute discret
WRInaute discret
 
Messages: 79
Inscription: 20 Fév 2004

Message le Mar Juil 04, 2006 7:36

Salut !

Moi je te conseil juste une petite astuce pour améliorer ton script.

> dans ta boucle infinie, qui recharge ta page, pourquoi ne pas faire une requete à chaque boucle pour voir si un nouveau message a été envoyé, et dans ce cas là seulement recharger la page, plutôt que de la recharger infiniement même si aucun n'a été posté...

Tu me suis ?

Fred

DaMonkey
WRInaute discret
WRInaute discret
 
Messages: 79
Inscription: 20 Fév 2004

Message le Jeu Juil 06, 2006 7:27

Re salut à tous,

Au fait je suis sur un projet personnel qui m'a pris comme ca pour m'occuper de développer un système de tchat IRC (sans serveur IRC bien sûr, c pour faire une comparaison) en PHP /AJAX / MYSQL qui je trouve est plutôt pas mal parti...

Dès sont avancement un peu plus poussé qu'il ne l'est maintenant, je vous posterai un exemple promis !

Au fait je bosses en PHP5 et orienté objet autant le faire savoir pour qui le PHP5 et et/ou l'orienté objet font peur ;)


scull
WRInaute discret
WRInaute discret
 
Messages: 137
Inscription: 11 Mai 2003

Message le Jeu Juil 06, 2006 19:42

Mais sa doit commencer une bande passante de fou avec php ajax non ?

DaMonkey
WRInaute discret
WRInaute discret
 
Messages: 79
Inscription: 20 Fév 2004

Message le Jeu Juil 06, 2006 22:32

scull a écrit:Mais sa doit commencer une bande passante de fou avec php ajax non ?


En fait, c'est ca que je me dit, donc je cherche à développer (mais c'est pour la suite quand tout tourne rond) un systeme de queue... comme un daemon pour imprimante, qui met les documletn en queue pour les envoyer un par un par un...

Mais ce sera pour la suite, en tout cas je trouve que mon début est positif :) en tout cas ca marche bien en local, déjà essayé moi 2 navigateurs différents et un pote en simulatané, ca marche nickel...

Tourne avec entre autre fonction d'information quand un new user entre dans le tchat, ainsi que quand un user du tchat quitte le tchat (ferme le navigateur ou change de page) (avec mise a jouir de la liste de users connecté en même tps) en temps réel :)

Et ce sans aucun rafraichiessement

A suivre... ;)

venomelektro
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 257
Inscription: 16 Juin 2005

Message le Lun Déc 04, 2006 23:15

plutot que de remplacer le innerhtml de tout la discution tu devrais regarder du coté de prototype.js et de l objet "insert"

new Insertion.Top('ton-div-de-chat', les_nv_msgs );

de cette manière en faisant un controle par un timestamp tu ne récupère que les nouveaux messages.
Dernière édition par venomelektro le Mar Déc 05, 2006 13:38, édité 1 fois.

itsme
WRInaute impliqué
WRInaute impliqué
 
Messages: 744
Inscription: 13 Oct 2004

Message le Mar Déc 05, 2006 9:46

scull a écrit:Mais sa doit commencer une bande passante de fou avec php ajax non ?

non, car on peut se contenter de n'ajouter que les nouveaux messages a chaque rafraichissement au lieu de tout le fil de discussion.
cf prototype.js ;)

preuter64
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 9
Inscription: 10 Jan 2006

firefox fuite memoire

Message le Mer Fév 21, 2007 2:33

Bonjour,

j ai ecris un chat tres basique avec php / ajax qui fait une requete automatique tous les 5 secondes pour recuperer les nouveaux messages (mysql).

Tout fonctionne a priori SAUF le probleme memoire suivant :

Sous firefox (v1.5) j ai un probleme de memoire : le gestionnaire de taches processus m indique un processus qui consomme de plus en plus de memoire - et au bout de quelques heures firefox plante

Avez vous rencontré un meme probleme ?

Un extrait de mon code est ici

Code: Tout sélectionner
function file(fichier)
     {
     if(window.XMLHttpRequest) // FIREFOX
          xhr_object = new XMLHttpRequest();
     else if(window.ActiveXObject) // IE
          xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
     else
          return(false);

        xhr_object.open("GET", fichier, false);
        xhr_object.send(null);
         if(xhr_object.readyState == 4)
        {
                 return(xhr_object.responseText);
        }
        else
        {

                return(false);
        }
}



et puis pour l appeler :



Code: Tout sélectionner
function getChatText(once) {

                  var time = new Date();
                  var secs = time.getTime();

                 document.forms['chatForm'].elements['chatbarText'].setAttribute('autocomplete','off');
                        var texte;
                        texte = file("getchatnew.php?bidon="+secs);

                        xhr_object = null;
                        document.getElementById('chattextnew').innerHTML = (texte);

                       if (once ==0)
                       {

                                setTimeout('getChatText(0);',5000);
                        }

         }



Tout commentaire est super apprecié. J ai passé la journée pour chercher la fuite memoire et pas trouvé .... Par exemple, connaissez vous une extension firefox (a part firebug) qui me monitore la memoire utilisé (ou meme mieux : perdue ?)?

Pat


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :