Requete ajax sur base sql

Requete ajax sur base sql - HTML/CSS - Programmation

Marsh Posté le 10-05-2010 à 19:34:05    

Bonjour,
J'essaie de développer, pour l'intranet de mon entreprise, une page se mettant à jour toute seule depuis une base sql.
Explication : la page est une liste de différentes informations récupérées dans une base sql ; en html classique il faut forcer la page à se recharger toutes les x secondes pour que les informations restent à jour (car ces informations sont modifiées par mes collègues très fréquemment).
Tout heureux de découvrir l'ajax, j'ai essayé de l'appliquer de façon synchrone ou asynchrone (soit en lançant ma requete en boucle infini, soit le serveur teste en permanence une mise à jour et envoie le résultat si c'est le cas). Le problème évident, c'est que ça surcharge la machine, soit la mienne soit le gros serveur du patron.
 
Je me demandais s'il est possible de "surveiller", avec Ajax, une base sql, pour se mettre à jour. ou éventuellement si, par une autre technique / autre langage, cela est possible ?
 
Merci d'avance!

Reply

Marsh Posté le 10-05-2010 à 19:34:05   

Reply

Marsh Posté le 10-05-2010 à 19:45:55    

Tu aurais du code à montrer, pour comprendre ce que tu fais.
 
 

Reply

Marsh Posté le 12-05-2010 à 19:59:09    

David Boring a écrit :

Tu aurais du code à montrer, pour comprendre ce que tu fais.
 
 


 
En copie-collage, ça fait :
- Dans mon fichier principal en php, je créé un DIV avec ID="liste". Ensuite, en javascript :
function charger()
  {
   try
   {
    var requete_ajax_list = new ActiveXObject(\"Microsoft.XMLHTTP\" );
   }
   catch(e)
   {
    var requete_ajax_list = new XMLHttpRequest();
   }
   requete_ajax_list.open('GET', 'ajax_list.php?liste=liste', true);
   requete_ajax_list.onreadystatechange = function () {
    afficherList(requete_ajax_list)
   }
   requete_ajax_list.send(null);
   
  }
 
  function afficherList(requete_ajax_list)
  {
   if(requete_ajax_list.readyState == 4)
   {
    if(requete_ajax_list.status == 200)
    {
     $('liste').innerHTML = requete_ajax_list.responseText;
    }
   }
   
  }  
 
Enfin, dans mon fichier requete_ajax_list.php :
if($_GET['liste']=="liste" )
{  
 $requete_nb="SELECT COUNT(*) AS nombre FROM ". $maTable ." WHERE ". $conditions;
  $resultat_nb=mysql_db_query("$database", $requete_nb);
  if($unResultatNb=mysql_fetch_array($resultat_nb))
  {
   $nombreDeResultats = $unResultatNb['nombre'];
                        // ensuite si y'a plus de résultats on envoit le résultat de la requete
  }
Là, je peux tester une différence dans le nombre de résultats pour voir si le resultat est différent, et alors l'envoyer à ma page ajax ; cela dit étrangement (c'est ironique) ça me bloque le serveur comme il faut.
 
D'où ma question : est-il possible de surveiller le remplissage d'un table SQL sans bloquer le serveur, pour en informer un programme ajax ?


Message édité par rolintoucour le 14-05-2010 à 08:54:25
Reply

Marsh Posté le 16-05-2010 à 01:41:55    

Quand tu appelles ta page PHP manuellement, ca bloque aussi ton serveur ?
 
Ton "blocage" c'est un freeze, un lag, un BSoD,... ?

Message cité 1 fois
Message édité par Pascal le nain le 16-05-2010 à 01:42:04
Reply

Marsh Posté le 16-05-2010 à 10:20:36    

Pascal le nain a écrit :

Quand tu appelles ta page PHP manuellement, ca bloque aussi ton serveur ?
 
Ton "blocage" c'est un freeze, un lag, un BSoD,... ?


 
J'ai mal copié mon code, dans la version que j'ai présentée ça bloque pas. Ma version blocante de mon php ressemble à ça :
 
while(true)
{
        $requete_nb="SELECT COUNT(*) AS nombre FROM ". $maTable ." WHERE ". $conditions;  
  $resultat_nb=mysql_db_query("$database", $requete_nb);  
  if($unResultatNb=mysql_fetch_array($resultat_nb))  
  {  
                    $nombreDeResultats = $unResultatNb['nombre'];  
                    if($nombreDeResultats != $nombreDeResultatAnterieur)
                               {on renvoie le resultat a jour à afficher et on l'enregistre en cookie pour comparer dans la prochaine occurence; break;}
                     
                         
  }  
Le problème est que mon script boucle en permanence pour compter le nombre de résultats, et ne renvoyer un résultat que si mon table est mise à jour. D'où un lag génial qui bloque le serveur à tous les collègues pour qq dizaines de secondes...
}

Reply

Marsh Posté le 16-05-2010 à 14:37:10    

Si tu fais un while(true) c'est pas étonnant que ton serveur galère un poil :p

Reply

Marsh Posté le 16-05-2010 à 19:27:26    

Pascal le nain a écrit :

Si tu fais un while(true) c'est pas étonnant que ton serveur galère un poil :p


Mais comment je peux faire alors pour détecter un changement sur ma base sql sans pourrir le serveur?

Reply

Marsh Posté le 16-05-2010 à 19:36:36    

C'est du coté client, et donc en javascript, que doit être la boucle infinie.
Par exemple, toutes les 10 secondes, tu recharges ta page.
Ton script php ne fait qu'une seule requete et renvoie le résultat du temps T.
10 sec après, tu recharges ta page, et le résultat sera celui du temps T+1.
 
Et voila, tu es à jour  ;)
 
Ou sinon tu la fais en ajax. La page est chargée une bonne fois pour toute, et les valeurs sont mises a jour via une requete ajax périodique.

Message cité 1 fois
Message édité par Pascal le nain le 16-05-2010 à 19:40:36
Reply

Marsh Posté le 16-05-2010 à 23:06:38    

Pascal le nain a écrit :

C'est du coté client, et donc en javascript, que doit être la boucle infinie.
Par exemple, toutes les 10 secondes, tu recharges ta page.
Ton script php ne fait qu'une seule requete et renvoie le résultat du temps T.
10 sec après, tu recharges ta page, et le résultat sera celui du temps T+1.
 
Et voila, tu es à jour  ;)
 
Ou sinon tu la fais en ajax. La page est chargée une bonne fois pour toute, et les valeurs sont mises a jour via une requete ajax périodique.


 
Ca j'ai réussi à le faire, je fais actuellement une page en ajax qui se met à jour toutes les 10s mais l'idéal serait qu'elle se mette vraiment à jour dès que ma table sql est mise à jour sans les 10s. Du coup je suppose que ce n'est plus possible ???

Reply

Marsh Posté le 17-05-2010 à 02:59:11    

Non c'est impossible.
La base de donnée ne peut pas créer d'événement lorsqu'elle est modifiée...
 
Mais je te propose une solution qui peut te convenir :
 
Tu crées un endroit (fichier texte ou enregistrement sql) où tu vas stocker le timestamp de la dernière modification.
A chaque fois que quelqu'un modifie la base, il met en plus à jour ce timestamp.
 
Dans la page où tu affiches tes informations, en ajax tu vas juste chercher le timestamp. S'il est plus récent que celui de ta page, tu le remplaces et tu refais une requete ajax pour mettre à jour tes données.
 
Ainsi, puisqu'il y a juste un timestamp à communiquer, et non pas toutes les données, tu peux te permettre de faire un refresh plus souvent, genre toutes les secondes.
 
Encore une fois, cela risque de surcharger le serveur, si plusieurs personnes font 1 requete par seconde. Si le contenu est petit (timestamp), ce sont les headers d'envoi qui deviennent significatifs (plusieurs lignes).
 
Mais c'est vrai que le web est pas fait pour ca... A la base, tu charges ta page, et tu la consulte une fois téléchargée...
 
Sinon tu peux tenter avec un petit bout de flash, qui lui, te permet une connexion permanente avec le serveur...

Reply

Marsh Posté le 17-05-2010 à 02:59:11   

Reply

Marsh Posté le 17-05-2010 à 10:59:18    

Merci je vais essayee ça ça serait déjà plus léger !

Reply

Sujets relatifs:

Leave a Replay

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