2011-05-09 2 views
1

jQuery.ajax() est "une fonction à appeler lorsque la requête se termine". Supposons que je fais une demande ajax à ajax.php:Quand jQuery.ajax() est-il complet {}?

<?php 

echo 'complete'; 

some_functions_that_echo_nothing(); 

?> 

Est-ce que le complet à attendre some_functions_that_echo_nothing()? Si oui, y a-t-il un moyen de faire que le {} complet se produise juste après l'écho et que l'ajax.php continue jusqu'à la fin?

+0

Terminez simplement la réponse HTTP. – Raynos

+0

Oui, la requête continue jusqu'à la fin de l'exécution de votre script PHP. –

Répondre

2

Essayez d'appeler HttpResponse::send();

+0

Je ne sais pas comment ça fonctionne HttpResponse. Il retourne juste la réponse et continue le script? Cela me semble bizarre. Ne serait-ce pas tenir votre fil apache. Alors que cela nuirait aux performances du serveur? – Eduardo

+1

@eduardocereto. Un serveur prend une requête HTTP avec toutes les données. Ensuite, vous commencez à écrire à la réponse. 'echo' est fondamentalement' HTTPResponse :: write() '. Lorsque vous envoyez la réponse HTTP, vous envoyez votre code HTML directement au client. Vous pouvez ensuite continuer à effectuer un traitement. Une fois arrivé à la fin du fichier, votre traitement devrait s'arrêter. Tout cela est renvoyer la page plus tôt que la normale. – Raynos

+0

Qu'en est-il du fil Apache? – Eduardo

2

Je devine que vous voulez à la sortie « complète » et laissez cette course de fonction en arrière-plan, car il est très lent.

Dans ce cas, mettez cette fonction dans un fichier séparé. Que ce soit proc.php et utiliser à la place:

<?php 
    echo "Complete'; 
    exec ("/usr/bin/php proc.php >/dev/null &"); 
?> 

qui renverra tout de suite et le fichier feu proc.php exécuter sur fond. Bien sûr, il ne sera pas en mesure de produire son retour à l'utilisateur, il devrait donc envoyer l'utilisateur quand il a fini, ou faire sa propre persistance.

EDIT: TOUJOURS prendre soin GREA de ce que vous mettez à l'intérieur exec déclarations. Ne mettez jamais les entrées de l'utilisateur dedans si vous n'êtes pas sûr à 100% que vous le désinfectez très soigneusement. Même ainsi, vous n'avez vraiment aucune raison d'utiliser l'entrée utilisateur dans un appel exec.

+0

Y at-il une raison de l'utiliser sur la méthode de Raynos? Je pensais que les appels système devaient être évités autant que possible – babonk

+0

Il me semble plus naturel de terminer le traitement de la page et de commencer un nouveau travail juste pour cette tâche. C'est juste une réponse simple, probablement pas la meilleure solution au problème. – Eduardo

+1

Une meilleure approche serait d'éviter l'appel sys et juste ajouter la tâche dans une file d'attente, et avoir un travail à exécuter sur cron et tirer des tâches de la file d'attente. – Eduardo