Un serveur de sockets entièrement développé en PHP5
Par -Alexandre LEGOUT aka LAlex- le jeudi, mai 6 2004, 16:06 - PHP - Lien permanent
Un site présenté dans la catégorie "Jeux" du FlashFestival 2004 représente un chat graphique agrémenté d'un petit jeu bien sympathique, duquel j'ai parfois du mal à décrocher : il s'agit de Chimboz. La particularité de ce site est que son serveur multi-utilisateur est codé en PHP. Du coup, l'envie de m'y remettre m'a pris ! ![]()
Histoire aussi de me mettre un peu à la nouvelle syntaxe de PHP5, j'ai effectué un mix improbable du patServer dont j'ai déjà parlé dans ce ticket, et de la version PEAR de ce même serveur auquel j'ai appliqué ma propre vision du code. J'y utilise les notions de méthodes statiques et de classes abstraites. J'ai implémenté une méthode broadcastEvent (on sait d'où ca vient :P) qui envoie des évenements à un objet de callback (seulement un seul pour l'instant, je réfléchis à l'utilité de ne pas limiter le nombre d'écouteurs, ce qui serait d'ailleurs trés simple à modifier) ...
Une classe SockServerManager agit en tant que Factory pour la création de nouveaux serveurs. Pour l'instant, elle se contente de créer une nouvelle instance d'un serveur et de la retourner, mais je prévois de lui faire stocker des références vers chaque serveur crée, et de lancer elle même un serveur avec son propre callback, qui pourra servir à l'administration de tous les serveurs lancés, dans le but de créer une interface d'administration en Flash. ![]()
L'utilisation de l'instruction socket_select me permet déjà de ne traiter que les sockets qui ont recu une information, sans toucher aux autres, mais je prévois aussi de me pencher sur tout ce qui est gestion des flux dans PHP, avec l'utilisation de sockets non-bloquants pour faire du pseudo multi-threading ... A ce propos, voici un article d'introduction au TCP/IP que j'ai trouvé trés interessant.
Voila, l'archive contient toutes les classes nécessaires. Attention, le .bat de lancement utilise le chemin complet du php.exe de PHP5, il faut donc le changer si votre version n'est pas installée dans C:\php5\php.exe ... Et il faut également activer l'extension des sockets dans votre php.ini ! Vous n'avez plus qu'à créer votre propre callback, qui peut intercepter les évenements onStart, onShutdown, onConnect, onConnectionRefused, onReceiveData et onClose ... ![]()
Commentaires
Vivement que le PHP 5 diffusé partout.. tu me donnes l'eau à la bouche sur ce coup là
Merci pour ce code ! Cependant, je n'arrive pas à récupérer le résultat sur la page php ou j'execute un petit client qui interroge le socket.
Le client interroge bien le socket mais je ne comprends pas comment récupérer la réponse (socket_recv ?) puisque la connection est ensuite sur un autre port (je ne sais pas si mon explication est très claire
)
Si tu as des idées, je suis preneur !
++
Fil des commentaires de ce billet