2009-08-06 5 views
0

J'ai un script qui a actuellement une étape où je déclenche une diffusion de la voix après l'inscription d'un client. C'est un appel nusoap à callfire.Éteignez le nusoap de php, n'attendez pas les résultats

La latence y est plutôt élevée, et il est ajouté environ 2 secondes à mon processus d'inscription de moins d'une seconde. En conséquence, j'ai des gens qui frappent le bouton d'inscription plus d'une fois.

Existe-t-il un moyen d'indiquer à l'application de ne pas attendre les résultats et de simplement passer à autre chose?

Il est possible de tricher en plaçant tout le code nusoap dans un fichier séparé, puis d'ouvrir un socket sur ce fichier, mais je cherche un moyen plus propre.

Ou existe-t-il un moyen de déclencher une fonction sans attendre les résultats? Je ne pense pas qu'il y en ait.

Répondre

1

Vous pouvez déplacer le code vers un script cli. Exécutez le script cli à partir du thread PHP du serveur Web. Le processus CLI forks alors, et le parent se termine. Le thread Web peut continuer et le processus enfant CLI peut inscrire l'utilisateur.En cas d'échec de l'appel SOAP, je vous suggère de stocker les données quelque part et de les supprimer ou de les marquer comme terminées une fois qu'elles sont réussies. Vous pouvez avoir un travail cron vérifier régulièrement si des appels ont échoué, et réessayez-les puis aviser quelqu'un (admin, utilisateur).

0

Si vous avez une action qui doit juste être «bientôt» plutôt que «tout de suite», ajoutez-la à une file d'attente quelconque (par exemple, une table de base de données).

Ensuite, un travail cron doit être effectué toutes les minutes et effectuer les tâches qui se trouvent dans cette file d'attente.

0

Pour autant que je sais qu'il n'y a pas un moyen de tirer directement sur une fonction et passer devant dans la chaîne d'exécution ... mais il y a des solutions simples: frais/

  • Comme vous l'avez mentionné , en mettant le code dans un fichier séparé et en l'éteignant de cette façon ... bien que j'utilise simplement une commande shell_exec pour l'exécuter et nohup it pour qu'il s'exécute en arrière-plan
  • Créer une file d'attente comme Paul l'a mentionné
  • Regardez dans quelque chose comme gearman (http://www.danga.com/gearman/) ... Digg a écrit quelques bonnes bibliothèques PEAR pour travailler avec elle. probablement un peu exagéré de gearman, mais il est trop cool pour ne pas mentionner :)
0

Vous pourriez penser à faire une requête Ajax à partir du navigateur:

  • utilisateur se connecte
  • il est redirigé vers une la page (sa page de compte, par exemple)
  • sur cette page, il y a un appel Ajax à un script PHP sur votre serveur, qui fait l'appel SOAP

C'est une idée que vous entendrez souvent, je pense ... Mais cela nécessite que l'utilisateur ait hava Javascript activé, et ne fonctionne pas toujours bien (que se passe-t-il si l'utilisateur quitte la page avant la fin de la requête Ajax?)

à mon humble avis, le meilleur (plus sûr, toujours travailler, ne dépend pas du client, ...) façon serait vraiment avec une file d'attente de demande, comme Paul suggested.
C'est la solution que je choisirais. Mais, bien sûr, cela ajoute un certain délai entre la connexion de l'utilisateur et le moment où la requête est envoyée ... mais est-ce si grave?

Questions connexes