|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 12 ![]() |
Bonjour,
J'ai réalisé des sockets php (client et serveur) mais je me heurte à un problème, lorsque dans mon onglet 1 j'attends des données, je ne peux pas écrire avec une nouvelle socket grâce à l'onglet 2. Je ne sais pas si l'option non block peut résoudre mon problème, je n'ai pas bien compris comment m'en servir. Par ailleurs, lorsque j'écoute mon serveur, dès que j'ai la réponse, je ferme ma connexion, ce n'est pas comme ceci que Stephane Eyskens fait, il affiche l'ip:port dans une frame, recupère le contenu d'avant et ajout le nouveau message. Serveur : Code :
Client (lecture) : Code :
Code :
Code :
Code :
|
||||||||||
|
|
00
|
|
|
#2 | ||
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Citation:
Citation:
Comment as-tu architecturé tes scripts? Quel morceaux dans quelle page? Lances-tu tous tes scripts via navigateur ou certains (serveur) via CLI?
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 12 ![]() |
Bonjour,
Merci de t'intéresser à mon problème. Désolé pour la latence de la réponse, je pensais être notifié par mail. Je lance en CLI le code serveur (Cf. le premier paragraphe de code). J'ai trouvé une solution pour passer outre, mais elle n'est pas utilisable en prod. Voici une des applications des sockets :
Elles sont chacune exécuté sur des postes client. Un commercial peut s'attribuer une commande, alors la liste des commandes doit s'actualiser sur tous les navigateurs l'affichant. Aujourd'hui, je stockes tous les messages avec l'ID de la commande et le nom du commercial, toutes les 1 secondes, ma socket va demander au serveur les messages et mets à jour les lignes de la liste des commandes. On perd pas mal l'intérêt de la mise à jour lorsqu'il y a une info. Le problème c'est que si j'attends l'info avec une boucle, cela empêche de mettre à jour le détail d'une commande. Ma liste boucle pour attendre l'info, tant qu'elle boucle, le même navigateur internet dans un onglet différent du poste client ne peut pas écrire au serveur. |
|
|
00
|
|
|
#4 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2007 Messages : 10 ![]() |
Salut Bazou,
Ta socket doit simplement accepter les connexions/opérations non bloquantes Et donc ton constructeur doit être Code :
Code :
Code :
PS: Tu devrais avoir une classe abstraite Socket, une SocketClient, et une SocketServer. PS2: Ta conception du problème initial (Gestion de commandes client/fournisseur en gros) est vraiment à revoir. Une simple architecture utilisant une BD, ajax et PHP est proprement interessante/scalable/efficace. |
||||||
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 12 ![]() |
Le problème de le mettre les sockets en non bloquantes c'est que je ne reçois jamais les messages, car je fais lecture, clôture.
Comment est-ce que je peux lire, rester connecté et lire quand même mon message arrive ? Tout en gardant la possibilité d'envoyer.
Tu as raison pour la classe abstraite, je vais reprendre tout ça. Pour ce qui est de l'appel en BD, à la base, je voudrais mettre à jour les infos dès qu'elles arrivent, sans faire un refresh toutes les X secondes. Actuellement c'est une table en memory. Mais le système se développera et évoluera surement pour d'autres choses, je voudrais donc ne pas utiliser de settimeout et faire du push d'information (sans installer un serveur apache différent comme ape ou utiliser node.js). |
|
|
00
|
|
|
#6 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : octobre 2007 Messages : 10 ![]() |
Citation:
(maladroitement d'ailleurs) à chaque tentative de lecture sur le serveur. Donc à chaque refresh en JS (coté CLIENT) tu as une nvelle demande de connexion et une nvelle tentative de lecture; Sans passer par une boucle active. Citation:
|
||
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 12 ![]() |
Comment le faire adroitement ?
Le problème d'un refresh c'est que si l'utilisateur ouvre 50 onglets, le serveur est bouché (car 50 appel toutes les X secondes), pour rien, car potentiellement il n'y a pas de nouvelle information. Ok pour le principe de l'HTTP, mais je veux étendre ce principe, au lieu d'avoir du poll : client -> serveur, donne moi les infos je veux du push : serveur -> tient client, voici les nouvelles infos. Cela est possible avec les sockets, puis que la socket master est capable de notifier tous les clients qui sont connectés. Si mes clients ne devaient pas lire ET écrire en même temps, tout irai bien. |
|
|
00
|
|
|
#8 | |
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Le gros souci que je trouve à ta solution c'est la connexion directe des clients à ton socket serveur.
Certes tu as du vrai push mais ta solution nécessite une ouverture de flux directe du client vers le serveur sur le port du socket serveur. Donc nécessité d'ouverture firewall et utilisation d'un proxy compliquée. Citation:
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 12 ![]() |
Je ne veux pas refresh toutes les X secondes, se sera beaucoup trop lourd pour notre faible MySQL.
Est-ce qu'il est possible d'avoir du temps réel ? Connais-tu un moyen ? Comment procèdent Facebook et GoogleDoc ? |
|
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Ingénieur développement logiciels Inscription : février 2008 Messages : 430 ![]() |
Je suis presque sûr que google et facebook n'utilisent pas de socket mais bien de l'ajax avec du refresh toutes les x secondes.....
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre. Linus Torvalds |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com