2011-06-21 4 views
3

J'ai essayé de faire fonctionner ce long script d'interrogation, mais je continue de me coincer. Cette fois, j'ai un problème avec la requête ajax sur le serveur. Le script php qui sert les données (exécution de l'interrogation longue en utilisant une boucle et le sommeil) fonctionne parfaitement bien, mais pas mon script jQuery.jQuery ajax php longue interrogation

Jusqu'ici, j'ai essayé d'utiliser une requête $.ajax() normale et une requête $.post() au script, mais quand je le fais, le script entier est bloqué. Eh bien, le script se charge comme il est censé le faire, mais la page montre qu'il continue à charger (en utilisant google chrome, il montre la barre "en attente" en bas de l'écran). Après le délai de 60 secondes dans le script php, le script jQuery reçoit "false" car aucune donnée n'a été trouvée. Le script est alors censé demander l'information agian.

Ma question est: comment puis-je éviter le navigateur montrant qu'il charge quelque chose en arrière-plan? Mon serveur est un serveur partagé, donc je n'ai pas accès quand il s'agit d'installer des choses sur le serveur lui-même, donc cela doit être résolu en utilisant seulement javascript (jQuery) et php.

EDIT: il suffit de vérifier mon script dans Internet Explorer et il ne semble pas montrer aucun signe que le script est chargement mais il est encore un problème dans Google Chrome

EDIT Affichage du code:

Ceci est mon fichier javascript:

if($("#interestboard")) 
{ 
    var lasttime = $("#lasttime").val(); 
    var pollurl = $("#pollurl").val(); 
    lpStart(); 
} 
function lpStart() 
{ 
    $.ajax({ 
     type: "GET", 
     url: pollurl+lasttime, 
     async: true, 
     cache: false, 
     success:function(data) 
     { 
      alert(data); 
     }, 
     error: function() 
     { 
      alert("Something went wrong"); 
     } 
    }); 
} 

Bien sûr, cela est enveloppé dans le $(document).ready()

Mon script php est quelque chose comme ce qui suit:

while(time()-$time<60) 
    { 
     $this->class = $class["id"]; 
     $this->orderBy("timestamp"); 
     $this->_extraConditions = "`timestamp`>'$lastTime' AND "; 
     $result = $this->search(); 
     if($result) 
      return $result; 
     usleep(250000); 
     clearstatcache(); 
    } 

Lorsque vous utilisez Firebug (avec Google Chrome), il montre seulement qu'une demande a été faite mais ne montrant pas le chargement-icône habituelle à la fin de la chaîne GET dans la console. Dans Firefox, il montre également qu'une requête est en attente (montrant l'icône de chargement) mais au moins le navigateur n'agit pas comme si la page était en train de charger.

Merci ...

+0

Utilisez-vous Firefox et firebug? Cela vous aidera à vous dire ce qui se passe. Pourriez-vous poster du code? – Brad

+0

Juste édité le message d'origine afin qu'il contienne le code source et une brève description du résultat de l'utilisation de Firebug – Simon

+0

J'ai commencé à travailler maintenant. Si je mets un timeout pour invoquer la fonction lpStart() deux secondes après que Google ait chargé Google Chrome ne montrera pas la barre de chargement mais cela présente un nouveau problème. Chaque fois que j'arrête la requête (c'est-à-dire en cliquant sur un lien) l'événement d'erreur est déclenché et je reçois une alerte me disant que "quelque chose s'est mal passé" (comme c'est supposé le faire). Après cela, ce site ne se chargera pas tant que le délai d'attente de la requête n'aura pas été atteint. Cela ne se produit que si je suis dans le même navigateur (même session) - pas quand je reçois l'erreur sur mon ordinateur iPad ... – Simon

Répondre

3

Je pense que vous devriez lire top commentaire sur Chrome AJAX on page-load causes "busy cursor" to remain - il semble qu'il est Google Chrome spécifique et vous devez attendre avant tout le contenu est chargé avant de faire un appel ajax.

EDIT: Juste une recommandation - maby Je me trompe: vous ne devriez pas utiliser les requêtes GET pour faire des opérations énormes/sensibles sur votre site car elles peuvent mener à une attaque facile sur votre site. Quiconque possède ou pirate un site à forte charge peut insérer un iframe invisible sur sa page afin que tout utilisateur visitant cette page puisse faire cette requête GET sans même s'en rendre compte - il peut planter/endommager votre serveur (des milliers de demandes arrivent à votre serveur). La plupart des navigateurs modernes n'autorisent pas les requêtes POST intersites, il devrait donc être sécurisé.

EDIT 2: À propos de l'indisponibilité de votre site tant que ce script fonctionne même après l'avoir interrompu: il est probablement dû aux sessions. Le comportement de session standard ne permettra qu'une seule instance php avec la même session s'exécutant au même moment - toutes les autres demandes attendront jusqu'à ce que la session soit fermée dans tous les autres scripts. Vous devez close the session ASAP dans le script, utiliser la gestion de session personnalisée qui permettra plusieurs demandes avec la même session (très probablement ce sera vraiment moche) ou detect user abort pour fermer le script dès que l'utilisateur l'a abandonné dans le navigateur.

+0

J'ai déjà essayé de détecter l'avortement de l'utilisateur mais j'ai lu quelque part quelque chose sur les permissions du répertoire de stockage de la session qui ne permettent pas au script php de détecter l'abandon de l'utilisateur. Je n'ai pas changé le répertoire de stockage de session par défaut. Savez-vous comment je peux détecter l'abandon de l'utilisateur en php quand il s'agit d'un appel ajax? – Simon

+0

Je l'ai fonctionné maintenant .. Une combinaison des deux choses que vous avez mentionnées. J'ai ajouté 'session_write_close();' juste avant la boucle while, puis ajouté 'if (connection_aborted) break;' à la fin de ma boucle while. De cette façon, il détecte l'avortement du script et tout fonctionne comme il est censé :-) – Simon

+0

Je suis content que je puisse vous aider. Mais vous avez obtenu cette information sur AJAX mauvais appel: le serveur Web ne peut pas détecter si l'utilisateur utilise AJAX appel ou juste une demande de page (bien que parfois il peut, mais pas très fiable): ils sont tous les deux demandes HTTP simples (vous pouvez même regarder aux demandes dans firebug et comparez-les). AJAX n'est pas une nouvelle technologie - il a été utilisé pendant des siècles (en utilisant des iframes), la seule nouvelle chose que nous avons obtenue avec l'objet XMLHttpRequest (ou analogues) est un meilleur contrôle de ce qui se passe dans cette requête. – XzKto

Questions connexes