Serveur de socket multiutilisateur en PHP
Par -Alexandre LEGOUT aka LAlex- le 15 mars 2004, 19:04 - PHP - Lien permanent
Actuellement en train d'étudier l'extension Socket de PHP, et plus largement les possibilités d'utilisation de PHP en ligne de commande (voire dans une GUI avec PHP-GTK) j'avais jusqu'à aujourd'hui la ferme intention de développer mon propre serveur de socket multi-utilisateur pour, entre autre, une utilisation conjointe à Flash. ![]()
Je dis bien jusqu'à ajourd'hui, car je suis tombé sur un serveur PHP nommé patServer. Il m'a suffit de regarder le code pour voir que c'est exactement ce que je voulais, et que coder le mien reviendrait à faire strictement la même chose. Donc, au lieu de réinventer la roue, je vais me contenter de dériver la seule et unique classe de ce serveur.
Simple mais trés bien pensé, il fournit un système de callback trés analogue aux évenements de Flash. Les évenements sont le strict nécessaire : démarrage, arret, nouvelle connexion, connexion refusée, nouvelle donnée, deconnexion. Avec un système de limitation du nombre de clients simultanés, et de configuration du caractère de fin d'un message (pratique pour le caractère 0 de Flash 8)).
Voici le code simplissime que j'ai utilisé pour créer un chat via telnet :/**
* MyServer.php
* classe serveur
*/
require_once "patServer.php";
class MyServer extends patServer {
function onConnect ($i) {
$this->broadcastData("Nouveau client", array($i));
}
function onReceiveData ($i, $data) {
$this->broadcastData($data);
}
}
/**
* launch.php
* Lancement du serveur
* Utilisation : taper 'php launch.php' en ligne de commande
*/
require_once "class/MyServer.php";
$srv = new MyServer();
$srv->start();
Et voila, je peux me connecter sur deux telnet différents et discuter avec moi-même !!! ![]()
Commentaires
Je vais regarder cela de prêt
merci pour l'info 
"Et voila, je peux me connecter sur deux telnet différents et discuter avec moi-même !!! "
LOL t'es genial !
oui je sais mes commentaires n'ont aucun interet ^^
Encore mieux, il existe une version PEAR de ce même serveur, qui en plus gère le multi-thread : Net_Server
++ ^^
pffff, assez doué pour comprendre ces krokettes de php machin truc et en meme temps tellement ignare sur les fonctions de base. lalex lalex lalex...... *soupir*
Petit con !
je suis ton blog depuis peu et c'est dingue comme tu as les mêmes idées que moi presque au même moment lol ... mon cerveau serait-il hacké ?

blague à part trés interessant ce lien merci
heu... comment ça, il faut lancer ça en ligne de commande sur la machine serveur, je ne vois pas là...
Le php est avant tout destiné avec un scripting simple intégré a une pages web, ou alors il est devenu le nouveau python !?
ce qui m'echappe c'est qu'il doit y avoir des serveur de services web (xml...) bien plus puissant. Pourquoi donc utiliser le php ?
Rooohhh ! Joli !
J'avais regardé ça de trés loin à l'époque où on parlait du support des sockets pour Apache 2.0 et qu'il n'était même pas encore sorti. Mais si tu configures Apache pour écouter aussi sur les ports >1024 tu n'as pas moyen de gérer un server XML socket brut de chez brut ?
Peut être par ce que c'est gratuit ?
tiens ? c'est quoi cette balise quote ?
désolé lalex 
salut,
Est ce que tu compte faire des tests par exemple avec le Unity de moock pour voir les differences en terme de rapidité de connexions, et autres performances en tout genres ?
bravo encore lalex, c'est toujours que du bonheur de trainer ici...
bonne continuation!
Gratuit je n'aimes plus ce mot sur le net
Tu veux dire libre kameleon, attention au nuances, y'a des années de bataille là derrière, demande à Stallman.
En fait comme le dit Tek, je trouverais plus normal de configurer apache pour ce job. Il est déjà bien plus proche du système que PHP pour lancer un demon.
Le PHP-GTK, j'ai du mal à voir où ça va, quel est l'intéret face à python, perl ?
vraiment, si c'est un truc qui tue, j'aimerais en savoir plus.
Dans tous les cas.. je pense pas qu'il faut exclure le PHP ... on peut faire pas mal de chose avec, même si pour moi le code ne me plait pas... la POO en PHP (faute d'avoir essayé en PHP5) c'est pas super top ... mais reste que le php est accessible par beaucoup de monde et il sera plus facile pour certains de se pencher dessus. De plus je trouve vraiment pas mal ce qui est fait sur les liens filé par lalex plus haut
gis >> PHP est avant tout un langage de programmation, un pur un vrai, sauf qu'il est interprété. Sa "connexion" au web est l'utilisation la plus connue, c'est tout
le module PHP d'Apache se content de faire interpreter le PHP, puis de rediriger la sortie standard vers le serveur Web.
Il a donc toute légitimité pour être utilisé afin de créer un serveur de Socket, un serveur de WebServices ou autre. Et il est tout aussi proche du système que Apache, bien que certainement moins performant car il s'agit d'un interprété (quoi que j'ai cru comprendre que le cache de Zend permettait de faire de la pré-compilation). Et Apache est un serveur HTTP, en conséquence, il ne sait que répondre à des requêtes HTTP ! A mon avis, tu ne sais pas comment cela fonctionne en détail.
Le serveur que je donne est fait pour être utilisé en ligne de commande, avec php.exe (sous Windows). L'équivalent existe bien évidemment sur Unix ou Mac. Apache n'a absolument rien à voir la dedans. Alors à moins qu'un hébergeur vous laisse faire du multi-thread, il sera à priori impossible de le lancer depuis une page web !
Pour ce qui est de PHP-GTK, l'interet est tout simplement que si tu sais utiliser PHP, c'est deja bien plus facile !
Quant au mot gratuit, c'est bien celui à utiliser : car là c'est bien de prix dont on parle !
Il y a du libre payant, du pas-libre gratuit, etc... Un langage comme ColdFusion est trés puissant, mais peu utilisé parce que payant ! 
yoy > Je ne me suis malheureusement pas encore penché sur les serveurs existants (Unity, ElectrServer, etc..) mais peut-être un jour !
Eka > Je mets beaucoup d'espoir dans la version 5, qui permettra enfin de faire de la "vraie" POO class-based !
Mais il faut bien arriver à faire la différence entre Flash et PHP !
Il faut penser différemment !
Eka > Je ne gère pas encore le [quote="quelqun") ...
Merci pour ton eclaircissement sur le PHP.
Pour moi, c'et vrai, c'est avant tout un language moyennement puissant destiné au web, dans un module d'apache.
PHP = hypertext préprocessor, je ne vois pas plus loin. de plus c'est un projet et l'apache software fondation, d'où ce lien dans mon esprit.
Je ne connais pas apache dans ses retranchement en effet, mais assez pour en avoir configurer 1 sous windows et 1 sous linux et comprendre comment ça fonctionne.
Quand au gratuit je ne suis pas d'accord, mais c'est un autre débat.
Ceci-dit l'idée est sympa... plus ouvert au grand public quoi.
mais le problème c'est comment lancé ça sur un serveur si il n'est pas dédié... là on fera avancé le swimblick.
salut,
je crois que lalex parle de lancer ca comme un demon puisque avec php tu peux faire du "en ligne" (php en tant que module de apache) ou du "en ligne de commande" comme si tu lancais un serveur socket en java
Donc faut oublier la page_web_serveur_socket et oui un serveur (dedié si tu veux) c'est obligatoire.
a++
lalex -> oui c'est ce que j'ai vu sur le quote="quelqu'un"

Pour faire du socket .. Dans tous les cas faut pas imaginer utiliser un mutualisé
Tu m'étonnes, moi j'ai laissé tomber flash, trop pourri, en plus le SVG me permet de faire exactemenet ce que je cherchais donc, je vais pas m'embêter hi hi hi
gis >> "ce qui m'echappe c'est qu'il doit y avoir des serveur de services web (xml...) bien plus puissant. Pourquoi donc utiliser le php ?"
hmmm, le XML n'est pas un serveur ou un language de programmation, c'est juste une maniere de structurer des données. Mais effectivement, il y a des serveur plus puissant. Je ne suis pas un codeur PHP, mais j'avoue avoir été seduit par le simplicité du code que LAlex a mis ci-dessus.Malgre cela, je crois que je vais rester avec le serveur que je suis fait en java.
Petite question pour les guru de PHP : est-ce que la version 5 supportera les Thread? Les variable d'application? Un API de connection BD universelle a la JDBC? Un parseur XSLT? Je sais, sa fais beaucoup de question a la fois, mais je suis curieux de le savoir. Parce que si c'est la cas, je vais commencer a songer serieusement si je devrais changer de technologie cote serveur.
A+
Le XSLT oui il me semble, tu peux déjà le faire
=> http://www.nexen.net/docs/php/annotee/ref.xslt.php
Par contre pour le reste, je ne sais pas trop là....

cool, mais un autre petite question : est-ce que les extension php sont des patches pour php.exe ou bien il y a un moyen de faire un import au runtime?
Tu peux faire un import, en fait pour utiliser telle ou telle extension avec php, il te suffit d'ouvrir le fichier php.ini et, à la fin de spécifier le nom du fichier d'extension, que tu veux utiliser

Eh ben liguorien, tu es bien curieux dis-moi !
Les fonction dont tu as besoin sont pour la plupart deja intégrée à PHP4, ou existent sous forme de modules.
Dans l'ordre :
- les threads sont deja gérés. Je n'ai pas une connaissance approfondie du sujet, mais une extension pour contrôler les processus existe : http://fr3.php.net/manual/fr/ref.pcntl.php
- les variables d'applications n'existent pas, a mon grand désespoir. Je ne sais pas si PHP5 va les gérer ...
- il existe des possibilités de connexion via ODBC. Pour le JDBC, ce n'est pas intégré, mais tu peux communiquer avec Java : http://fr3.php.net/manual/fr/ref.java.php
- le XSLT est deja géré : http://fr3.php.net/manual/fr/ref.xslt.php
- tu peux aussi charger des extensions dynamiquement : http://fr3.php.net/manual/fr/function.dl.php
En fait, le gros apport de PHP5 va être une sytanxe class-based (un peu comme le passage AS1
AS2, mais c'est du vrai class-based), une gestion utltra-simplifiée du XML, une base de données embarquée (SQLite, qui ne nécessite pas de serveur) 
++ ^^
mieu vaut trop s'informer que pas assez lorsqu'il est question de choix de technologie.
(pour les thread). php.net >> "Cette extension ne doit pas être activée pour une utilisation en serveur web, car les résultats pourraient être inattendus."
Zut, pas de support pour les thread dans un serveur web... Je crois que je vais rester avec Java meme si je suis TRES attiré par le code du serveur socket.
a plus!
LAlex, c'est indiscret de te demander à quoi ça peut bien servir tout ce baratin?
Liguorien>Les JSP m'intéressent de plus en plud est-ce que tu aurais deux ou trois URL de références afin que je puisse voir les possibilités et ainsi me motiver à m'y mettre lol
JF > Un serveur de socket est un serveur qui écoute sur un port, et peut répondre sur ce même port. Par exemple, un serveur IRC est un serveur de socket !
Pour décomposer le code que je donne :
Quand le serveur recoit la connexion d'un nouveau client, j'envoie le message "Nouveau client" à tous les clients sauf celui qui vient de se connecter (le deuxième paramètre contient les ID des clients exclus)
Quand le serveur reçoit un message d'un client, il le renvoie à tous les clients connectés !
L'avantage majeur est que Flash offre la possibilité de se connecter à ce type de serveur de socket, ce qui permet de créer par exemple des chats, ou des jeux multi-joueurs en ligne, car la connexion se fait en "direct-live" !
++ ^^
quix >> j'espere que tu comprends l'anglais...
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/
http://www.jsptut.com/
http://java.sun.com/developer/technicalArticles/Intl/MultilingualJSP/
http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?
nb -> si jamais tu te lance dans le java. Sa peut etre tres long avant que tu reusissent a pondre ta premiere application complete(donc il ne faut pas desesperer). Mais pour un petit site web, c'est assez intuitif.
A+
Merci pour les URLs

Pour le JAVA j'en ai déjà fait un peu donc ça devrait aller je pense, et puis au pire j'apprends c'est pas un soucis, c'est d'ailleurs ce qui fait que c'est drôle
Qwix > Quand on voit ce qu'a donné l'apprentissage du Flash ...
Lol le flash, c'est pas pareil, flash c'est d'la ......

Ptit con va
Bonjour tout le monde, alors voila est-ce que l'on peut lancer ce serveur depuis un browser (et non en passant par le cmd) ?
Merci
Nanu > Ben lis les commentaires précédents ...
Bon alors j'admets que je suis un peu en retard sur le sujet, car le PHP semble être un vrai language de programmation hors module apache, et l'interpreteur semble être présent sur la plupart des distributions linux.
Cependant comme pour moi c'est un language copié sur perl (ca n'engage que moi), je trouve que le tout se mord un peu la queue. D'autant que je doute des performances assez largement.
Ensuite, A priori, si on en est là, je ne vois pas pourquoi on ne pourait-on pas lancer ce script depuis un browser ??
après tout, en ajoutant le "#!/usr/bin/php" au fichier ci dessus et en le lancant à la manière d'un cgi... ça devrait marcher non ?
gis >> tu ne peux pas lancer le serveur socket depuis un browser pour la simple et bonne raison que la logique d'un serveur socket et de rentrer dans une boucle infini afin d'etre toujours pret a recevoir des requete. Si tu essais de le faire, apache attendra surement la fin du process avant de continuer ses autres taches. Mais avec java je n'ai pas ce probleme!
A+
liguorien >> Sur Unix, on peut lancer un process en tache de fond non ? Suffirait alors de faire executer une ligne de commande, et de se servir de la gestion des processus d'Unix directement !
++ ^^
LAlex >> c'est exact, mais je n'aime pas le fait d'etre lier a un systeme d'exploitation en particulier. Surtout que je developpe en windows. Mais si un jour Flash devient "full-support" sur Unix, peut-etre que sa va changer.
C'est clair. Mais d'un autre coté, quand il s'agit d'un serveur, c'est moins gênant d'être lié à un système spécifique, surtout si c'est Unix (ou Linux), qui représente la grande majorité du parc des hébergeurs ...
++ ^^
Bonjour lalex :), peux tu nous faire un petit howto car je n'arrive pas à lancer le server (d'ailleur faut t'il l'inclure à apache ou il est indépendant ???).
salutation
Prisedetete > Je ne vois pas ce que je peux expliquer de plus : tout est dans le code.:o
Il faut le lancer en ligne de commande !!! En gros, sous Windows XP, tu fais Demarrer > Executer > cmd ... Dans la fenêtre DOS, tu te rends dans le répertoire ou est situé ton fichier laucnh.php et tu tape
PS : Le mail n'est pas obligatoire ici. Plutôt que de mettre un faux mail, n'en mets pas, c'est mieux !
Salut,
Vraiment super cool ce blog.
Je voulais savoir s'il etait possible d'interfacer par socket un serveur C++ et des clients PHP.
J'ai essayé de me faire un client basique avec les sockets, mais je perds ma connection au bout d'un moment et vu que le but de cet appli est de realiser un affichage de flux temps reel en php, c'est un peu la galere.
Suggestions ?
Merci
Merci pour l'info, va falloir que je me penche sur la question
Salut,
Regarde les XMLHttpRequest, ca permet de faire du html/xml dynamique, sinon sur le blog de liguorien ya un article qui devrait peut etre t'interesser, sinon tu peux aussi rendre t'es graphique au sein d'une appli flash qui dialogue avec ton serveur avec un objet XMLSocket
t'as le choix
J'ai un peu de mal a comprendre le fonctionnement et surtout l'installation sur un serveur déddier.
Ce serai possible d'avoir une descriptions plus précise ?
Suis dans le brouilllard
merci pour ces éclaircissements et infos tres intéressantes.
Je n'arrive pas à lancé ce serveur ... un message d'erreur revient tout le temps :
Warning: socket_last_error() expects parameter 1 to be resource, null given in /home/boitasta/web/cgi-bin/include/patServer.php on line 480
patServer: Could not bind socket to localhost on port 10000 ( msg: Success / Code: )
slt
j aurai besoin de votre aide svp
je devolope une apllication php ki a pr bu de scanner les ports 25 d'une plage d adresse ip mais l ennui c est k il faut prendre encompte le timeout. donc il faut utiliser La fonction socket_set_nnoblok()
avez vs un suggession a me proposer
merci d avance
Un socket serveur sur un serveur web (qui est lui aussi un socket serveur), c'est pas redondant ça ?
salut,
j'essaye depuis deux jours de faire du xmlsocket en flash avec ce serveur.
/**
* MyServer.php
* classe serveur
*/
require_once "patServer.php";
require_once "patXMLServer_Dom.php";
class testsocket extends patXMLServer_Dom {
function onConnect ($i) {
$this->broadcastData("Nouveau client", array($i));
}
function onReceiveData ($i, $data) {
$this->broadcastData($data);
}
}
/**
* launch.php
* Lancement du serveur
* Utilisation : taper 'php launch.php' en ligne de commande
*/
$srv = new testsocket();
$srv->start();
?>
pour le php
et :
onLoad(){
index=0;
cnx = new XMLSocket();
cnx.connect("127.0.0.1",10000);
cnx.onConnect = infoConnexion;
cnx.onData = function(src) {
donneesbrutes_txt = src;
};
cnx.onXML = function(xml) {
status_txt = "Réception de données...";
texte = xml.firstChild.firstChild;
}
}
function infoConnexion(ok) {
index++;
if (ok) {
status_txt = "Connexion réussie ! N° "+index+" ";
_root.debug.text=status_txt;
} else {
status_txt = "Echec de la connexion ! N°"+index+" ";
_root.debug.text=status_txt;
cnx.connect("127.0.0.1",10000);
}
}
pour le flash et ça m'affiche Echec dela connexion N°1-2-3-4-5-6-7-8-9 etc.....
help! please!!
Je suis en train de m'interesser de pres a la fonction xmlHTTPrequest en javascript.
et j'aimerai utiliser un tel serveur en php, java , ou autres afin de traiter les requetes javascript.
Malheureusement pour moi, il m'est impossible d'invoquer directement le serveur en question, et je suis obligé de passer par un script intermédiaire, car je doit comminiquer avec ma machine distante par HTTP.
D'ou la redondance...
>> Un socket serveur sur un serveur web (qui est lui aussi un socket serveur), c'est pas redondant ça ?
Je ne pense pas si j'ai bien suivi car le script php n'est pas gerer par apache ici mais directement executer a l'aide de php.exe
dites moi si je me trompe ...
salut Lalex;
depuis un moment je cherche patserveur sur le web mais je ne le trouve pas ?
qlq1 vaudrait me l'envoyer sur ma boite mail numedianet@yahoo.net
patserveur est inclus dans PEAR, ici http://pear.php.net/package/Net_Ser...
Fil des commentaires de ce billet