2010-12-08 27 views
1

J'envoie un HTTP POST request de mon application C++ à un script PHP sur un serveur. En utilisant HttpOpenRequest/HttpSendRequest/etc. Actuellement, il attend que le script PHP finisse d'être exécuté avant les retours HttpSendRequest. Y at-il de toute façon pour changer cette fonctionnalité?HttpSendRequest n'attend pas la fin du script PHP

J'envoie les données juste avant la fermeture de mon application C++, donc je ne veux pas qu'il reste là pendant plus de 10 secondes en attendant que le script PHP finisse d'être exécuté. Je veux juste qu'il envoie les données, puis fermez l'application. Une chose que je pensais était d'avoir le script PHP spawn un autre script PHP dans un processus différent en utilisant la commande exec, de sorte que le premier script revenait tout de suite. Cependant, j'envoie beaucoup de données avec ma requête HTTP POST, donc j'aurais besoin de transmettre ces données au processus engendré.

Idéalement, je veux juste un drapeau à définir pour dire HttpSendRequest de ne pas attendre. Je ne pouvais pas voir quelque chose d'évident dans les docs, mais peut avoir raté quelque chose.

Répondre

2

Vous pouvez vouloir ignore_user_abort() dans votre script PHP. Ensuite, vous pouvez fermer la connexion à partir de votre client C après l'envoi des données et PHP continuera à faire ce qu'il est censé faire.

+0

Le problème est que c'est le HttpSendRequest qui bloque. Donc, je ne peux pas fermer la connexion jusqu'à ce que cette fonction retourne. – Dan

+0

Mais il bloque seulement jusqu'à ce qu'il ait reçu la réponse, non? http://www.php.net/manual/fr/features.connection-handling.php#71172 – rik

+0

Aha! Le code du lien que vous avez posté correspond à ce que je voulais et à l'appel de ignore_user_abort(). L'en-tête ("Connection: close") plus les fonctions ob_ * permettent de fermer la connexion plus tôt. Cela pourrait valoir la peine de mettre à jour votre message avec cette info au cas où quelqu'un d'autre a ce problème. Merci :-) – Dan

3

Vous pouvez appeler le InternetOpen avec le INTERNET_FLAG_ASYNC et d'avoir votre rappel ne rien faire de conséquence.

Voici quelques exemples de code pour vous aider à démarrer:

http://www.codeproject.com/KB/IP/asyncwininet.aspx

ensuite (comme le suggère rik), appelez ignore_user_abort(true); en haut de votre script PHP pour assurer qu'il exécute entièrement.

ignore_user_abort