Chat php / ajax

A
Anonymous
Guest
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:
...
<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
 
WRInaute discret
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é ;)
 
A
Anonymous
Guest
merci de ta reponse...

j'avais deja essayé :
Code:
<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...
 
WRInaute discret
Suffit de fabriquer le time avec javascript, forcement s'il est en php il va pas bouger beaucoup :lol:
 
A
Anonymous
Guest
en fait DMX avait raison :

Code:
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...
 
WRInaute discret
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
 
WRInaute discret
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 ;)
 
WRInaute discret
scull a dit:
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... ;)
 
WRInaute discret
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.
 
WRInaute impliqué
scull a dit:
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 ;)
 
Nouveau WRInaute
firefox fuite memoire

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:
 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:
 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
 
Discussions similaires
Haut