Question

Avec ce code, je peux afficher un gif animé pendant l'exécution du script serveur:

function calculateTotals() {
    $('#results').load('getResults.php', null, showStatusFinished);
    showLoadStatus();
}

function showLoadStatus() {
    $('#status').html('');
}


function showStatusFinished() {
    $('#status').html('Finished.');
}

Toutefois, je souhaite afficher un statut indiquant l'état d'avancement du script, par exemple. "Ligne de traitement 342 sur 20 000 ..." et laissez-le compter jusqu'à ce qu'il soit terminé.

Comment puis-je faire cela? Je peux créer un script de serveur qui contient constamment les informations mises à jour, mais où dois-je placer la commande pour lire ceci, par exemple, toutes les secondes?

Était-ce utile?

La solution

Après avoir lu vos commentaires sur la réponse d'Andrew.

Vous liriez le statut comme ceci:

function getStatus() {
    $.getJSON("/status.php",{"session":0, "requestID":12345}, 
    function(data) { //data is the returned JSON object from the server {name:"value"}
          setStatus(data.status);
          window.setTimeout("getStatus()",intervalInMS)
    });
}

Cette méthode vous permet d’ouvrir plusieurs requêtes XHR simultanément sur le serveur.

tout votre status.php à la sortie est:

{"status":"We are done row 1040/45983459"}

Vous pouvez toutefois entrer autant d'informations que vous le souhaitez dans la réponse et les traiter en conséquence (alimentation d'une barre de progression par exemple ou exécution d'une animation ..)

Pour plus d'informations sur $ .getJSON, voir http://docs.jquery.com/Ajax /jQuery.getJSON

Autres conseils

Je ne suis pas au courant des particularités de jQuery, mais une réponse générale qui ne nécessite pas d'interrogation serait: Utilisez une variante du technique de forever frame . Fondamentalement, créez un iframe caché et définissez le src sur 'getresults.php'. À l'intérieur de Get Results, vous diffusez " " Les blocs de script back, qui sont des appels à une fonction javascrpt dans le document parent qui met réellement à jour la progression. Voici un exemple qui illustre l'idée de base derrière un cadre permanent. (Je ne recommanderais pas d'utiliser son JS ou HTML actuel, il est raisonnablement moyen.)

Votre script côté serveur devrait en quelque sorte conserver sa progression quelque part sur le serveur (fichier, champ dans la base de données, memcached, etc.).

Vous devriez avoir la fonction AJAX retournant la progression actuelle. Interrogez cette fonction une fois par seconde et affichez le résultat en conséquence.

Sans savoir comment fonctionne votre code serveur, il est difficile de dire. Cependant, le processus comporte trois étapes. Premièrement, vous devez appeler un script de création d’emploi. Cela retourne un numéro d'identification et met le serveur en marche. Ensuite, toutes les secondes environ, vous devez appeler un script d'état qui renvoie un message d'état que vous souhaitez afficher. Ce script d'état doit également renvoyer une valeur indiquant si le travail est terminé ou non. Lorsque le script d'état indique que le travail est terminé, vous arrêtez d'interroger.

Comment obtenir ce script d'état? Le statut de la tâche dépend en grande partie de la configuration du serveur, mais implique probablement l'écriture du message dans une table de base de données à différents moments de la tâche. Le script d'état lit ensuite ce message dans la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top