Mon script est appelé par le serveur. Du serveur je recevrai ID_OF_MESSAGE
et TEXT_OF_MESSAGE
.
Dans mon script, je vais gérer le texte entrant et générer une réponse avec les paramètres: ANSWER_TO_ID
et RESPONSE_MESSAGE
.
Le problème est que j'envoie une réponse à incomming "ID_OF_MESSAGE"
, mais le serveur qui m'envoie un message à traiter définira son message comme livré (cela signifie que je peux lui envoyer une réponse à cet ID), après avoir reçu la réponse http 200.
L'une des solutions consiste à enregistrer le message dans la base de données et à créer un cron qui s'exécutera chaque minute, mais je dois générer un message de réponse immédiatement.
Existe-t-il une solution pour envoyer au serveur la réponse http 200 et continuer à exécuter le script php?
Merci beaucoup
header("Content-Encoding: none")
fastcgi_finish_request()
à la finJ'ai vu beaucoup de réponses ici suggérant l'utilisation,
ignore_user_abort(true);
mais ce code n'est pas nécessaire. Tout cela fait est de s'assurer que votre script continue à s'exécuter avant qu'une réponse ne soit envoyée dans le cas où l'utilisateur abandonne (en fermant son navigateur ou en appuyant sur échapper pour arrêter la demande). Mais ce n'est pas ce que vous demandez. Vous demandez de continuer l'exécution APRÈS l'envoi d'une réponse. Tout ce dont vous avez besoin est ce qui suit:Si vous craignez que votre travail en arrière-plan prenne plus de temps que la limite de temps d'exécution du script par défaut de PHP, alors restez
set_time_limit(0);
en haut.la source
Si vous utilisez le traitement FastCGI ou PHP-FPM, vous pouvez:
Source: https://www.php.net/manual/en/function.fastcgi-finish-request.php
Problème PHP n ° 68722: https://bugs.php.net/bug.php?id=68772
la source
J'ai passé quelques heures sur ce problème et je suis venu avec cette fonction qui fonctionne sur Apache et Nginx:
Vous pouvez appeler cette fonction avant votre long traitement.
la source
filter_input
fonction, elle renvoie parfois NULL. voir la contribution de cet utilisateur pour plus de détailsModifié un peu la réponse par @vcampitelli. Ne pensez pas que vous avez besoin de l'en-
close
tête. Je voyais des en-têtes de fermeture en double dans Chrome.la source
J'utilise la fonction php register_shutdown_function pour cela.
http://php.net/manual/en/function.register-shutdown-function.php
Edit : ce qui précède ne fonctionne pas. Il semble que j'ai été induit en erreur par une vieille documentation. Le comportement de register_shutdown_function a changé depuis le lien de lien PHP 4.1
la source
Je ne peux pas installer pthread et aucune des solutions précédentes ne fonctionne pour moi. Je n'ai trouvé que la solution suivante pour fonctionner (ref: https://stackoverflow.com/a/14469376/1315873 ):
la source
en cas d'utilisation de php file_get_contents, la fermeture de la connexion ne suffit pas. php attend toujours l'envoi de eof witch par le serveur.
ma solution est de lire "Content-Length:"
voici un exemple:
response.php:
Notez le "\ n" en réponse à la ligne de fermeture, sinon le fget lu en attendant eof.
read.php:
Comme vous pouvez le voir, ce script attend environ eof si la longueur du contenu est atteinte.
j'espère que ça aidera
la source
J'ai posé cette question à Rasmus Lerdorf en avril 2012, en citant ces articles:
J'ai suggéré le développement d'une nouvelle fonction PHP intégrée pour notifier à la plate-forme qu'aucune autre sortie (sur stdout?) Ne sera générée (une telle fonction pourrait prendre soin de fermer la connexion). Rasmus Lerdorf a répondu:
Je peux voir son point, et soutenir son opinion pour certaines applications / scénarios de chargement! Cependant, dans certains autres scénarios, les solutions de vcampitelli et al, sont bonnes.
la source
J'ai quelque chose qui peut compresser et envoyer la réponse et laisser un autre code php s'exécuter.
la source
Il existe une autre approche et il vaut la peine de considérer si vous ne voulez pas altérer les en-têtes de réponse. Si vous démarrez un thread sur un autre processus, la fonction appelée n'attendra pas sa réponse et retournera au navigateur avec un code http finalisé. Vous devrez configurer pthread .
Une fois que nous exécutons $ continue_processing-> start (), PHP n'attendra pas le résultat de retour de ce thread et donc aussi loin que rest_endpoint est considéré. C'est fait.
Quelques liens pour vous aider avec les pthreads
Bonne chance.
la source
Je sais que c'est un ancien, mais peut-être utile à ce stade.
Avec cette réponse, je ne soutiens pas la question réelle, mais comment résoudre ce problème correctement. J'espère que cela aidera d'autres personnes à résoudre des problèmes comme celui-ci.
Je suggérerais d'utiliser RabbitMQ ou des services similaires et d'exécuter la charge de travail en arrière-plan à l'aide d' instances de travail . Il existe un package appelé amqplib pour php qui fait tout le travail pour que vous puissiez utiliser RabbitMQ.
Avantages:
Neg's:
la source