OVH Cloud OVH Cloud

Fermer la socket PHP?

6 réponses
Avatar
Denis Labat
Bonjour.

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.

Le client reçoit bien la confirmation, grâce à un petit flush() mais il
attend ensuite la fermeture de la socket et finit en timeout.
Un header "Connection: close" ne change rien.

Une suggestion?

Merci.

6 réponses

Avatar
frederic girard
Denis Labat wrote:
Bonjour.

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.

Le client reçoit bien la confirmation, grâce à un petit flush() mais il
attend ensuite la fermeture de la socket et finit en timeout.
Un header "Connection: close" ne change rien.

Une suggestion?

Merci.
Exit() ??


Avatar
vv
"Denis Labat" a écrit dans le message de
news:438d7b12$0$617$
Bonjour.

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.

Le client reçoit bien la confirmation, grâce à un petit flush() mais il
attend ensuite la fermeture de la socket et finit en timeout.
Un header "Connection: close" ne change rien.

Une suggestion?

Merci.


Hello,

Le serveur aura probablement envoyé le header HTTP/1.1, et le "Connection:
close" est probablement ignoré car il manque "Content-Length".
Tenter dans un premier temps de mettre également un header "Content-Length",
et si ça ne fonctionne pas (ou si trop compliqué à déterminer en amont sans
output buffering), de forcer une réponse HTTP/1.0 avec
header('HTTP/1.0 200 OK');

Ceci dit, ça m'interesse de savoir si ça fonctionnera grâce à cela.
Il me semble que vous devrez également instruire PHP de ne pas terminer le
script suite à la fermeture de la connexion de la part du client (celle-ci
sera détectée immédiatement sur certains systèmes, sur d'autres uniquement
si le script retente d'écrire quelque chose).

-- vv

Avatar
Denis Labat
Denis Labat wrote:

Bonjour.

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.

Le client reçoit bien la confirmation, grâce à un petit flush() mais
il attend ensuite la fermeture de la socket et finit en timeout.
Un header "Connection: close" ne change rien.

Une suggestion?

Merci.


Exit() ??



Oups... Ma question n'est pas complète...

Ma page récupère les données entrantes dans $_POST, elle renvoie une
page "OK" au mobile, fait un pti flush()... Et commence à attaquer la
base de données!

Je ne peux donc pas mettre un exit() après le flush(). Et le client
continue à attendre la fermeture de la socket, même si je le route sur
une autre page avec un header location.


Avatar
Antoine Polatouche
Denis Labat wrote:
Bonjour.

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.


ignore_user_abort();

puis affichage d'une page OK signalant au client qu'il peut fermer la
fenêtre, et/ou avec un lien sur une autre page...

Avatar
Denis Labat

Le serveur aura probablement envoyé le header HTTP/1.1, et le "Connection:
close" est probablement ignoré car il manque "Content-Length".
Tenter dans un premier temps de mettre également un header "Content-Length",
et si ça ne fonctionne pas (ou si trop compliqué à déterminer en amont sans
output buffering), de forcer une réponse HTTP/1.0 avec
header('HTTP/1.0 200 OK');



Merci pour ces idées, je vais essayer...

Avatar
John GALLET
Bonjour,

J'ai des traitements assez longs à effectuer en PHP. J'aurais donc
souhaité renvoyer une page "OK" au client après avoir reçu ses données
et fermer ensuite la socket.
Le client reçoit bien la confirmation, grâce à un petit flush() mais il
attend ensuite la fermeture de la socket et finit en timeout.
Un header "Connection: close" ne change rien.


C'est l'un des rares cas où j'essaierais bien un header Location vers la
page disant Ok, sans mettre d'exit derrière. La suggestion du
ignore_user_abort devrait dans ce cas être seulement une protection
"think safe", donc ne mange pas de pain. De l'une des discussions assez
anciennes maintenant sur le sujet, il en avait été conlu à l'époque que
ça rentrait dans les utilisations possibles de Location, quelqu'un avait
décrit une espèce de cascade de pages pour lancer des traitements en
background. Jamais testé moi même. En revanche, si tu es sous unix et
que tu as accès à system(), tu peux parfaitement lancer ces traitements
en vraies tâches détachées, cf http://faqfclphp.free.fr/#rub4.2

a++;
JG