2010-03-22 2 views
2

J'ai un processus PHP qui prend du temps à s'exécuter. Je ne veux pas que le processus AJAX qui l'appelle attende que ça se termine. Lorsque le processus PHP se termine, il définit un champ dans une base de données. Il devrait y avoir une sorte d'appel d'interrogation AJAX pour vérifier périodiquement le champ de la base de données et définir un message.ajax: n'attendez pas de réponse, mais vérifiez-la périodiquement

Comment puis-je configurer un appel jQuery AJAX pour interroger plutôt que d'attendre? Est-ce que le script PHP doit faire quelque chose de spécial?

Répondre

2

Il est plus facile d'avoir votre action côté serveur, répondez simplement avec une réponse négative jusqu'à ce que la valeur soit prête et configurez le côté client pour interroger plusieurs fois (avec setTimeout()) jusqu'à ce qu'une réponse positive soit reçue ou nombre d'échecs est observé.

var timer; 
var count = 0; 
function poll(url) { 
     timer = setTimeout(function() { 
      $.ajax({ 
       url: url, 
       success: function(data) { 
        if (data.Status) { 
         ...do something... 
        } 
        else { 
        if (++count > 10) { 
         ...failure action... 
        } 
        else { 
         poll(url); 
        } 
        } 
       ...other options... 
      }) 
     },5000) 
} 

ensuite sur l'utilisation côté serveur quelque chose qui fait (pseudocode) ...

if operation is not complete 
    return serialize({ Status : false }) 
else 
    data = .... 
    data.Status = true 
    return serialize(data) 
end 
0

Une solution rapide serait de créer un autre script PHP que vous pouvez appeler vérifiera que, depuis L'accès direct aux bases de données via la méthode comm de AJAX n'est pas une bonne pratique.

  1. Créez un fichier PHP, avec la vérification DB requise. Faites-le donc il affichera 'T' ou 'F' ou quelque chose comme ça
  2. Créez un SetInterval('yourfunctionname',100) afin que vous puissiez appeler le script d'interrogation.
  3. Si la réponse à cette interrogation est 'T', appelez votre autre script de longue date.
2

Étape 1: Premier appel au processus long - Définir ignore_user_abort (true); dans le script PHP qui prend beaucoup de temps et ferme la connexion.

Étape 2: Vérifiez si le champ de base de données est mis à jour à l'aide des méthodes suggérées.

+0

@stackoverflow: à l'étape 1, comment fermer la connexion? Je pensais envoyer un en-tête 202 (accepté), mais cela se termine généralement par 'exit()' qui mettrait fin au script. – dnagirl

+0

http://www.php.net/manual/fr/features.connection-handling.php#71172 peut être utile. – stackoverflow