2009-06-08 5 views
2

Je fais une requête AJAX à un script PHP qui renvoie un nombre à partir d'un fichier texte qui change. Cette requête AJAX devrait arriver toutes les 3 secondes. Cependant, une requête AJAX est faite une fois et elle ne retourne rien et firebug montre que la requête AJAX GET est toujours en cours. Après quelques minutes, il revient et produit un nombre. Il aurait dû faire plusieurs appels mais il n'en a fait qu'un et il est revenu avec une réponse finale. J'ai du mal à comprendre comment cela s'est passé! :(Pourquoi cette requête AJAX prend-elle autant de temps lorsqu'elle doit effectuer plusieurs appels?

//this is called first which calls getStatus which should get the progres of the 
//conversion. This AJAX request takes a long time to come back which may hinder the 
//getStatus coming back quickly maybe? 
function convertNow(validURL){ 

     startTime = setTimeout('getStatus();', 6000); 
     $.ajax({ 
     type: "GET", 
     url: "main.php", 
     data: 'url=' + validURL + '&filename=' + fileNameTxt, 
     success: function(msg){ 
     }//function  
    });//ajax 

}//function convertNow 

function getStatus(){ 

    $.ajax({ 
    type: "POST", 
    url: "fileReader.php", 
    data: 'textFile=' + fileNameTxt, 
    success: function(respomse){ 
    textFileResponse = respomse.split(" "); 
    $("#done").html("Downloading" + textFileResponse[0]); 

    if(textFileResponse[0]=='100.0%'){ 
      $("#loading").hide("slow"); 
     $("#done").html("Complete"); 
     return; 
    } 
     continueTime = setTimeout('getStatus();', 3000); 
    } 
    });//ajax 
} 

Le script PHP la seconde fonction des appels JavaScript est le suivant:

$fileName = $_POST['textFile']; 
//calls an external script to get the text file output 
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName"); 
echo $result; 

Le rectiffent, et ma logique capturée au-dessus ou ne précède signifie qu'une seule requête AJAX sera? fait?

Cette question est en relation avec another question. Un script PHP que je pensais que précédemment était lent. J'espère que le problème est maintenant lié JavaScript.

Merci à tous pour votre aide.

Répondre

1

Je me demandais quand ce code supposait de fonctionner du tout. Disons que toute l'idée d'implémenter quelque chose de similaire en Javascript est douteuse. Tout d'abord, parce que vous n'avez pas du tout de techniques de synchronisation en JavaScript, mais dans votre code, vous vous basez sur un ordre particulier d'exécution de votre code, ce qui n'est pas le cas dans 99% des cas. En réglant:

setTimeout("getStatus", 6000); 

vous créer une sorte de concurrence, vous pouvez donc obtenir le second script exécuté en premier, bien que vous en retard, mais deux requêtes peuvent atteindre le serveur en même temps, donc probablement le second script ne vous retourne rien, donc la fonction de succès ne sera plus exécutée.
Mon conseil chaud à vous envisager de refonte de votre application, car le problème n'est définitivement pas dans la partie Javascript du tout.

BTW, je pense que l'utilisation de l'appel .ajax $ doit être aussi:

$.ajax({ 
type: "POST", 
url: "fileReader.php", 
data: { param1: value1, param2:value2...etc}, 
success: function(respomse){ ...}}); 

PS. Le fait que la réponse prenne beaucoup de temps pour renvoyer le problème du côté serveur et pas dans votre code en Javascript.Et si nous avons commencé à parler de journalisation et que vous avez mentionné firebug, vous pouvez utiliser console.log ("msg") pour vous connecter à firebug console vos messages.

+0

Vous avez raison de ne pas être la partie JS. Il s'est avéré être le problème de PHP qui ne revenait pas avec quoi que ce soit pendant longtemps parce qu'une autre méthode AJAX était en train de se faire, ce qui, je pense, l'a retardé! J'ai besoin de le redessiner! – Abs

1

Je ne sais pas si vous pouvez faire

setTimeout("getStatus();",3000); 

mais je sais que vous pouvez faire

setTimeout(getstatus,3000); 

Je ne suis pas sûr de ce que vous utilisez dans la lenteur, mais je essayerait de mettre des alertes dans: avant l'ajax, et à la réussite, imprimer dans un php (début et fin possibles), et alerter dans le javascript lorsque vous définissez le continueTimeout, peut-être même alerte lorsque le timeout se déclenche ... Comme:

function getStatus(){ 
    alert('getStatus Started'); 
    $.ajax({ 
    type: "POST", 
    url: "fileReader.php", 
    data: 'textFile=' + fileNameTxt, 
    success: function(respomse){ 
     alert('ajax success'); 
     textFileResponse = respomse.split(" "); 
     $("#done").html("Downloading" + textFileResponse[0]); 
     if(textFileResponse[0]=='100.0%'){ 
     $("#loading").hide("slow"); 
     $("#done").html("Complete"); 
     return; 
     } 
     alert('starting continuetime'); 
     continueTime = setTimeout(**getStatus**, 3000); 
     } 
    });//ajax 
    } 
+1

Ou si vous utilisez firebug ou webkit, faites console.log() au lieu des alertes. –

+0

Oui, ou même créer une zone de texte avec un ID d'erreur et l'utiliser pour afficher: var log = $ ('# errorlogging'); log.val (log.val() + "Message d'erreur ... \ n"); – Lathan

+0

En utilisant la version d'alerte simple pour le débogage, tout comme vous avez fait Lathan. Je trouve que la fonction getstatus ne revient qu'avec un essai et une réponse réussis d'une requête AJAX. La poursuite des appels AJAX n'est jamais atteinte. Donc le traitement de ce script PHP doit être super lent !! – Abs

1

Vous devriez mieux utiliser setInterval au lieu de setTimeout

aussi Ne pas oublier « var » lorsque vous utilisez une nouvelle variable.

Si les paramètres passés sont corrects et que la requête ajax ne renvoie toujours rien, alors le coupable est côté serveur.

+0

Si vous allez "toutes les 3 secondes" comme vous le dites, vous voulez setInterval, pas setTimeout, setTimeout se déclenche juste après un délai. –

+0

en fait, il ne veut pas exécuter ces fonctions tout le temps, c'est la raison pour laquelle il utilise setTimeout. vous pouvez le voir, il les appelle du "ping-pong", chacun en appelant un autre dans certaines conditions. –

0

Est-ce que fileReader.php s'appelle dans une boucle infinie?

Bien sûr, ça sonne comme ça. En regardant le petit extrait de code là-bas, ça ressemble à ça aussi. (

Si fileReader.php est, alors il fait probablement autant d'appels que le serveur Web autorise par client, puis il est mis en attente, ce qui explique pourquoi vous n'obtenez pas d'erreur de débordement de pile . Lorsque l'ajax expire (après 60 secondes ou peu importe), l'ensemble de la pile d'appels fileReader.php s'éteint et vous obtenez la réponse du premier ajax. Ou peut-être vous êtes parti avec la réponse de la première fileReader -call. Erh pas sûr.

Peut-être essayer d'ajouter

if(!isset($_POST['textFile'])){echo "ERR: POST['textfile'] not set!"; exit(-1);} 

avant la partie dans la fileReader.php -file vous montriez.

Questions connexes