Bonjour à toutes et à tous,
Après de nombreux tests et beaucoup de recherche, je me tourne vers Développez avec l'espoir que peut-être, le problème auquel je suis confronté trouvera sa solution.
A mon sens, ce problème me semble davantage tenir de l'anomalie que du problème.
Par pur loisir, j'ai développé une application multi-utilisateurs dont la communication est assurée par un serveur de socket codé en PHP. L'utilisateur s'identifie, le serveur l'enregistre et diffuse l'information à tous les membres connectés. Bref, tout fonctionne à merveille.
L'anomalie rencontrée est la suivante :
Selon la documentation PHP, socket_read renvoie FALSE lorsque la tentative de lecture sur une socket échoue. Autrement dit, quand la lecture sur une socket échoue, c'est parce que la connexion a été rompue. Donc que le client a quitté l'application. Concernant mon application, lorsque le client utilise Chrome, le fait qu'il se déconnecte se détecte instantanément. En revanche, lorsqu'il utilise Firefox, un délais variable d'environ 15/20 secondes s'écoule avant que le serveur ne détecte la déconnexion du client.
Pensez-vous qu'il puisse s'agir d'un comportement du navigateur ? Dans ce cas, pourrait-on imaginer une parade ? Une requête Ajax asynchrone à la fermeture de la page qui serait en charge de forcer la déconnexion ?
En simplifiant, voici la portion de code qui détecte la déconnexion :
Au plaisir de discuter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $buf = @socket_read($this_socket, 2048, PHP_NORMAL_READ); if ($buf == false or $buf == '') { # Le membre vient de se déconnecter, on le supprime du tableau des resources co. unset($sockets_connectes[array_search($this_socket, $sockets_connectes)]); $its_name = array_search($this_socket, $membres_co); unset($membres_co[array_search($this_socket, $membres_co)]); send_message(array_diff($membres_co, array($this_socket)), 'leaving', $its_name); echo 'déco'; break; } ?>
Partager