Statut de connexion dans PHP

February 20th, 2010

Ces derniers je fais un peu de push en HTTP, donc une information importante pour moi est le statut de connexion. En théorie cette information m’est donnée par la fonction connection_status(). Mais il faut savoir comment PHP connait ce statut (je n’ai regardé que pour le mod_php5 de apache et le cgi, mais c’est probablement vrai dans les autres cas) : en fait, le serveur web n’envoit jamais de signal à PHP pour dire “hop c’est bon on n’a plus besoin de toi ta gueule” quand l’utilisateur ferme sa connexion. PHP ne se rend compte de la fermeture de la connexion uniquement quand il tente d’envoyer des données au serveur, car le serveur lui dit “non je peux pas écrire les données, la connexion est fermée”.

En d’autres termes, si vous attendez un évènement (grâce à une fonction bloquante par exemple), même si vous appellez régulièrement la fonction connection_status() le résultat sera faux car vous n’avez envoyé aucune donnée. Et encore plus grave, si vous attendez votre évènement avec une fonction bloquante, le processus passe en mode S (sleep), ce qui fait que le temps est stoppé, et que le max_execution_time n’est jamais atteint : le processus reste bloqué là éternellmement. Face à ça, pas beaucoup de solutions… Vous pouvez envoyer un espace chaque seconde (en n’obliant pas d’appeller ob_flush() et flush()), ou alors vous pouvez faire des timeouts et faire en sorte que le client refasse une requête juste après, ou autre hack du genre… Vous pouvez aussi vous passer de PHP, mais ça c’est une autre histoire :) .

Entry Filed under: PHP, Trucs et astuces

Leave a Comment

hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe to the comments via RSS Feed


Calendar

July 2010
M T W T F S S
« Jun    
 1234
567891011
12131415161718
19202122232425
262728293031  

Most Recent Posts

Wikipedia Affiliate Button