[AJAX] Problème pour affichage de l'heure

Problème pour affichage de l'heure [AJAX] - HTML/CSS - Programmation

Marsh Posté le 02-11-2007 à 13:42:37    

Bonjour à tous,

 

Je débute en AJAX (c'est mon premier script) et j'ai un souci pour afficher l'heure sur mon site.

 

Voici mes scripts :

 

browser.js qui permet de détecter le navigateur et de faire des requêtes AJAX en fonction de celui-ci.

Code :
  1. function Browser() {
  2. if (navigator.userAgent.indexOf('Opera')!=-1)
  3.  this.opera=true;
  4. if (navigator.userAgent.indexOf('Konqueror')!=-1)
  5.  this.konqueror=true;
  6. if (navigator.userAgent.indexOf('Safari')!=-1)
  7.  this.safari=true;
  8. if (navigator.userAgent.indexOf('Firefox/1.0')!=-1)
  9.  this.ff10=true;
  10. if (navigator.userAgent.indexOf('Firefox/1.5')!=-1)
  11.  this.ff15=true;
  12. if (navigator.userAgent.indexOf('Firefox/2.0')!=-1)
  13.  this.ff20=true;
  14. if (navigator.userAgent.indexOf('Netscape/7.0')!=-1)
  15.  this.netscape=true;
  16. if (navigator.userAgent.indexOf('MSIE 7')!=-1)
  17.  this.ie7=true;
  18. if (navigator.userAgent.indexOf('MSIE 6')!=-1)
  19.  this.ie6=true;
  20. if (this.opera)
  21.  this.navigateur="Opera";
  22. if (this.konqueror)
  23.  this.navigateur="Konqueror";
  24. if (this.safari)
  25.  this.navigateur="Safari";
  26. if (this.ff10 || this.ff15 || this.ff20)
  27.  this.navigateur="Firefox";
  28. if (this.ie7 || this.ie6)
  29.  this.navigateur="Internet Explorer";
  30. if (!this.navigateur)
  31.  this.navigateur="Inconnu";
  32. this.getHttpObject = function () {
  33.  if (this.navigateur=="Internet Explorer" )
  34.   return new ActiveXObject('Microsoft.XMLHTTP');
  35.  else
  36.   return new XMLHttpRequest();
  37. }
  38. }
  39. var browser=new Browser();
 

Le script lui-même :

Code :
  1. <script type="text/javascript">
  2. function majHorloge ()
  3. {
  4. var requete=browser.getHttpObject();
  5. requete.open('GET','heure.php',true);
  6. requete.onreadystatechange = function () {
  7.  afficheHorloge(requete);
  8. }
  9. requete.send(null);
  10. }
  11. function afficheHorloge(requete)
  12. {
  13. if (requete.readyState == 4)
  14. {
  15.  if (requete.status == 200)
  16.  {
  17.   $('heure').innerHTML = "Il est <b>"+requete.responseText+"</b>";
  18.   majHorloge();
  19.  }
  20. }
  21. }
  22. majHorloge();
  23. function $(id)
  24. {
  25. return document.getElementById(id);
  26. }
  27. //-->
  28. </script>
  29. <div id="heure"></div>
 

Et enfin, le fichier heure.php

Code :
  1. <?php
  2. $heure=date("H:i:s" );
  3. while ($heure=date("H:i:s" )) {
  4.  sleep(1);
  5. }
  6. echo date("H:i:s" );
  7. ?>
 

Au final, le div reste vide et j'ai une erreur d'affichée dans la console :
http://img232.imageshack.us/img232/7175/erreurajaxmc8.jpg

 

Savez-vous d'où le problème peut venir ?

 

Merci d'avance :jap:


Message édité par nero27 le 02-11-2007 à 14:03:17
Reply

Marsh Posté le 02-11-2007 à 13:42:37   

Reply

Marsh Posté le 02-11-2007 à 14:53:36    

Aïe! Ca pique les yeux tout ça !
 
Bon, commençons avec ça :
tu sais que ton script php, là, il tourne en boucle sans jamais renvoyer de résultat ! Jolie boucle infinie ceci-dit :D
 
Un conseil (le prend pas mal hein ! C'est pour t'aider) : revoit donc tes bases avant de vouloir faire de l'ajax !

Message cité 1 fois
Message édité par kao98 le 02-11-2007 à 14:54:23

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 02-11-2007 à 14:57:09    

kao98 a écrit :

Aïe! Ca pique les yeux tout ça !
 
Bon, commençons avec ça :
tu sais que ton script php, là, il tourne en boucle sans jamais renvoyer de résultat ! Jolie boucle infinie ceci-dit :D
 
Un conseil (le prend pas mal hein ! C'est pour t'aider) : revoit donc tes bases avant de vouloir faire de l'ajax !


Arf, en effet, j'avais pas vu cette erreur de débutant :pfff:
 
En fait, je ne pensais pas que l'erreur venait du PHP, donc je n'avais pas regardé de ce côté-là.
 
Maintenant, ça fonctionne sous FF et IE6, mais pas sous IE7 : est-ce normal ?

Reply

Marsh Posté le 02-11-2007 à 14:59:22    

Si j'ai bien compris, tu veux afficher l'heure en temps réelle en la demandant à chaque fois au serveur ?
 
Heu, c'est un truc à ne pas faire ça ! Ca va tuer les perfs du serveur, la bande passante, ... Pis même, d'où t'es donc venue cette idée ?


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 02-11-2007 à 15:04:15    

kao98 a écrit :

Si j'ai bien compris, tu veux afficher l'heure en temps réelle en la demandant à chaque fois au serveur ?

 

Heu, c'est un truc à ne pas faire ça ! Ca va tuer les perfs du serveur, la bande passante, ... Pis même, d'où t'es donc venue cette idée ?


Mon sites est un élevage virtuel sur lequel se déroulent des enchères : je voudrais que l'heure affichée soit toujours identique à celle du serveur pour que les membres puissent enchérir facilement. Pour ce qui est de la bande passante et des perfs du serveur, je ne pense pas qu'un simple "echo" puisse vraiment les plomber, non ?

 

PS: le serveur est un opteron 180 avec 1Go de RAM.


Message édité par nero27 le 02-11-2007 à 15:04:36
Reply

Marsh Posté le 02-11-2007 à 15:09:42    

C'est pas ce que doit renvoyer le serveur qui va être lourd, c'est simplement le nombre de requête HTTP à gérer !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 02-11-2007 à 15:12:35    

kao98 a écrit :

C'est pas ce que doit renvoyer le serveur qui va être lourd, c'est simplement le nombre de requête HTTP à gérer !


Erf, en effet, surtout multiplié par le nombre de connectés, ça peut faire mal :/

Reply

Marsh Posté le 02-11-2007 à 15:36:05    

Exactement ! :)


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 02-11-2007 à 15:46:02    

Si tu veux diminuer la charge du serveur et garder une synchro correcte, tu peux faire comme ca :
 
Dans le code javascript, dans la fonction majHorloge, tu mets un timer d'une seconde qui relance la fonction (avec setTimeout ou quelquechose comme ca, je l'ai plus en tete). Comme ca, ta fonction ne se lance "que" toutes les secondes.
 
Ensuite, dans ta fonction tu rajoutes un compteur, qui s'incrémente à chaque exécution de la fonction. suivant la valeur du compteur, tu fais ca :
 
Si compteur < 60 : tu rajoutes 1 seconde à l'heure sans faire de requete au serveur
Si compteur = 60 : tu fais une requete au serveur, tu mets a jour avec l'heure du serveur, et tu remets le compteur à zéro.
 
Comme ca tu limites les requêtes, et tu restes à peu près synchronisé :)
 
PS : j'ai pas mis de code, mais l'idée y est :P Il y a peut être un ou deux ajustements à faire, mais en gros t'as les grandes lignes du fonctionnement.

Reply

Marsh Posté le 02-11-2007 à 16:01:58    

astryad a écrit :

Si tu veux diminuer la charge du serveur et garder une synchro correcte, tu peux faire comme ca :
 
Dans le code javascript, dans la fonction majHorloge, tu mets un timer d'une seconde qui relance la fonction (avec setTimeout ou quelquechose comme ca, je l'ai plus en tete). Comme ca, ta fonction ne se lance "que" toutes les secondes.
 
Ensuite, dans ta fonction tu rajoutes un compteur, qui s'incrémente à chaque exécution de la fonction. suivant la valeur du compteur, tu fais ca :
 
Si compteur < 60 : tu rajoutes 1 seconde à l'heure sans faire de requete au serveur
Si compteur = 60 : tu fais une requete au serveur, tu mets a jour avec l'heure du serveur, et tu remets le compteur à zéro.
 
Comme ca tu limites les requêtes, et tu restes à peu près synchronisé :)
 
PS : j'ai pas mis de code, mais l'idée y est :P Il y a peut être un ou deux ajustements à faire, mais en gros t'as les grandes lignes du fonctionnement.


Pour ce qui de lancer une requête que toutes les secondes, c'est déjà le cas avec mon sleep(1) dans le code PHP ;)
 
Par contre, mélanger l'incrémentation et la MAJ AJAX, ça peut être une bonne idée [:paysan]

Reply

Marsh Posté le 02-11-2007 à 16:01:58   

Reply

Marsh Posté le 02-11-2007 à 16:41:08    

La différence entre le sleep(1) et le timeout en javascript, c'est que dans un cas, c'est ton serveur qui bouffe une seconde à attendre, et dans l'autre c'est le client qui attend une seconde avant de lancer la requête :)
 
Je pense qu'il est préférable de faire patienter le client plutôt que ton serveur fasse des sleep à longueur de temps (surtout qu'il est possible que le sleep consomme du temps processeur).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed