IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Configuration] Multi connexions ???


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut [Configuration] Multi connexions ???
    Bonjour à toutes et à tous,

    Je suis en train d'écrire un script php qui doit tourner en permanence dans le but de :


    - recevoir une requête HTTP
    - récupérer le flux de données (format XML)
    - effectuer le traitement nécessaire
    - renvoyer la réponse HTTP (format XML)


    Pour l'instant mon programme fonctionne, mais ne gère qu'une seule connexion à la fois, voici son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    <?
     
    // Autorise l'exécution infinie du script, en attente de connexion.
    set_time_limit(0);
     
    // Active le vidage implicite des buffers de sortie, pour que nous
    // puissions voir ce que nous lisons au fur et à mesure.
    ob_implicit_flush();
     
    $address = '192.168.1.15';
    $port = 8061;
    $ip = $_SERVER["REMOTE_ADDR"];
     
    	// Crée la socket
    	if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    	   echo "socket_create() a échoué : raison : " . socket_strerror($sock) . "\n";
    	}
     
    	// Lie un nom à la socket
    	if (($ret = socket_bind($sock, $address, $port)) < 0) {
    	   echo "socket_bind() a échoué : raison : " . socket_strerror ($ret) . "\n";
    	}
     
    	// Ouvre la socket sur le port
    	if (($ret = socket_listen($sock, 5)) < 0) {
    	   echo "socket_listen() a échoué : raison : " . socket_strerror ($ret) . "\n";
    	}
    do{	
    	// Accepte la connexion
    	if (($msgsock = socket_accept($sock)) < 0) {
    	   echo "socket_accept() a échoué : raison : " . socket_strerror ($msgsock) . "\n";
    	}
     
    	// Crée la socket
    	if (false === ($buf = socket_read($msgsock, 2048))) {
    	   echo "socket_read() a échoué : raison : " . socket_strerror ($ret) . "\n";
    	}
     
     
    	/*
    	.
    	.
    	.
    	.	[TRAITEMENT => utilisation de $buf et envoi du retour dans $flux]
    	.
    	.
    	.
    	*/
     
     
    	//Envoi du retour XML
    	$contentLength = strlen($flux);
     
    	$send = "HTTP/1.1 200 OK\n";
    	$send .= "Content-Type: text/xml; charset=utf-8\r\n";
    	$send .= "Content-Length: " . $contentLength . "\r\n\r\n";
    	$send .= $flux;
    	$send .= "\r\n";
     
    	socket_write($msgsock, $send, strlen($send));
    	socket_shutdown($msgsock,2);
    	socket_shutdown($sock,2);
     
    }while(true);
     
    ?>

    Je voudrais maintenant que mon programme gère plusieurs connexions simultanées, mais je ne sais pas comment faire ???


    Merci d'avance pour vos réponses!!

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut Re: Multi connexions ???
    Citation Envoyé par cilv1
    Je suis en train d'écrire un script php qui doit tourner en permanence dans le but de :


    - recevoir une requête HTTP
    - récupérer le flux de données (format XML)
    - effectuer le traitement nécessaire
    - renvoyer la réponse HTTP (format XML)
    Je n'ai pas trop bien compris l'intéret... Pourquoi ne pas faire confiance à apache ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Désolé de ne pas avoir été assez clair.

    Le script php tourne sur Windows Server 2003 avec IIS6, qui lui écoute les requêtes HTTP sur le port 80 et fait son travail de serveur Web.

    Par contre, je suis chargé d'écouter sur le port 8061 qui lui va recevoir des données au format XML, concrètement il s'agit de commandes passées par de nombreux pharmaciens dans toute la France.

    Mon programme est également chargé de récupérer ces commandes, de les intégrer dans le logiciel ERP et de transmettre les informations de retour sur ce même port 8061 (par réponse HTTP).

    Mon problème est que pour l'instant un seul pharmacien peut se connecter en même temps, ce qui n'est pas souhaitable pour ce genre de projet!

    Merci en tout cas pour la rapidité de ta réponse Mr. N

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ben tu peux configurer IIS pour écouter sur le port 80 normal, et écouter aussi sur le port 8061, pour une autre appli. Par contre je sais plus comment on fait ^^

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Le problème c'est que je ne sais pas comment récupérer les données lorsque c'est IIS qui écoute ???
    J'avais essayé en connectant une socket mais j'ai eu un message d'erreur comme quoi IIS écoute déjà sur le port...

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Tu peux donner un exemple de requete reçue par ton script php ?

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Oui, je te donne le script que j'ai écris et qui simule l'envoi d'une requête sur le port 8061 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
    error_reporting(E_ALL);
     
    /* Définit le port du service. */
    $service_port = '8061';
     
    /* Définit l'IP du serveur */
    $address = '192.168.1.15';
     
    /* Cree une socket TCP/IP. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     
    $result = socket_connect($socket, $address, $service_port);
     
    $fichier = "winpharma/tests/final/exemples/commande_test.xml";
     
    $dom_=new DOMDocument();
    $dom_->load($fichier);
    $reqBody =$dom_->saveXML();
     
    $contentLength = strlen($reqBody); 
     
    $send = "POST /pharmaml.php HTTP/1.1\r\n";
    $send .= "Host: localhost\r\n";
    $send .= "Accept: */*\r\n";
    $send .= "User-Agent: test.php test automation\r\n";
    $send .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $send .= "Content-Length: " . $contentLength . "\r\n\r\n";
    $send .= $reqBody; 
    $send .= "\r\n";
     
    socket_write($socket, $send, strlen($send))
    or die("Write failed<br>");
     
    while ($out = socket_read($socket, 2048)) {
       echo $out;
    }
     
    socket_close($socket);
     
    ?>

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ok et dans pharmaml.php, que donne le résultat de ceci (au début du script) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump('<pre>',$_REQUEST,'</pre>');die();

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    ca ne donne rien du tout, ou plutot ca fonctionne normalement :
    je lance pharmaml.php, qui tourne en permanence, puis je lance le script de test d'envoi de la requete et lors de la reponse de celle-ci le script pharmaml.php continue de tourner, je peux envoyer d'autres requetes etc.

    A moins que j'ai placé le code au mauvais endroit mais je ne pense pas, au cas ou je te donne le code de pharmaml.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <? 
    var_dump('<pre>',$_REQUEST,'</pre>');die();
     
    include("winpharma/tests/final/xmlrpc.inc");
     
    // Autorise l'exécution infinie du script, en attente de connexion. 
    set_time_limit(0); 
     
    // Active le vidage implicite des buffers de sortie, pour que nous 
    // puissions voir ce que nous lisons au fur et à mesure. 
    ob_implicit_flush(); 
     
    $address = '192.168.1.15'; 
    $port = 8061; 
    $ip = $_SERVER["REMOTE_ADDR"]; 
     
       // Crée la socket 
       if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { 
          echo "socket_create() a échoué : raison : " . socket_strerror($sock) . "\n"; 
       } 
     
       // Lie un nom à la socket 
       if (($ret = socket_bind($sock, $address, $port)) < 0) { 
          echo "socket_bind() a échoué : raison : " . socket_strerror ($ret) . "\n"; 
       } 
     
       // Ouvre la socket sur le port 
       if (($ret = socket_listen($sock, 5)) < 0) { 
          echo "socket_listen() a échoué : raison : " . socket_strerror ($ret) . "\n"; 
       } 
    do{    
       // Accepte la connexion 
       if (($msgsock = socket_accept($sock)) < 0) { 
          echo "socket_accept() a échoué : raison : " . socket_strerror ($msgsock) . "\n"; 
       } 
     
       // Crée la socket 
       if (false === ($buf = socket_read($msgsock, 2048))) { 
          echo "socket_read() a échoué : raison : " . socket_strerror ($ret) . "\n"; 
       } 
     
     
       /* 
       . 
       . 
       . 
       .   [TRAITEMENT => utilisation de $buf et envoi du retour dans $flux] 
       . 
       . 
       . 
       */ 
     
     
       //Envoi du retour XML 
       $contentLength = strlen($flux); 
     
       $send = "HTTP/1.1 200 OK\n"; 
       $send .= "Content-Type: text/xml; charset=utf-8\r\n"; 
       $send .= "Content-Length: " . $contentLength . "\r\n\r\n"; 
       $send .= $flux; 
       $send .= "\r\n"; 
     
       socket_write($msgsock, $send, strlen($send)); 
       socket_shutdown($msgsock,2); 
       socket_shutdown($sock,2); 
     
    }while(true); 
     
    ?>

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Laisse tomber j'ai oublié que tu n'étais pas sur un serveur web...

    Alors si je comprend bien ta requête est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    POST /pharmaml.php HTTP/1.1
    Host: localhost
    Accept: */*
    User-Agent: test.php test automation
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 30
     
    <toto><titi></titi></toto>
    Est-ce que tu peux modifier cette requête ? car elle n'est pas très bien formée (avis personnel qui n'engage que moi, voir les rfc pour confirmation).
    tu envoie un x-www-form-urlencoded or il manque le nom de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req=<toto><titi></titi></toto>
    :

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Le mieux est de donner la requête originale, la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    POST /pharmaml.php HTTP/1.1
    Host: www.nepnet.net
    Content-Type: text/xml; charset="utf-8"
    Content-PharmaML: bM6fI3Rj0YfB0Hl/oY6+vQ==

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Donc ta requete est dans le header Content-PharmaML: ?

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Je ne suis pas sûr de ma réponse, mais voici la requete en entier (avec le header et le fichier xml) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    POST /pharmaml.php HTTP/1.1
    Host: www.nepnet.net
    Content-Type: text/xml; charset="utf-8"
    Content-PharmaML: bM6fI3Rj0YfB0Hl/oY6+vQ==
     
    <?xml version="1.0" encoding="UTF-8"?>
    <CSRP_ENVELOPPE xmlns="urn:x-csrp:fr.csrp.protocole:enveloppe" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Nature_Action="REQ_EMISSION" Version_Protocole="1.0.0.0" Id_Logiciel="WinPharma" Version_Logiciel="5.3.43" Usage="P">
    <ENTETE>
        <EMETTEUR Nature="OF" Code="00" Id="1391002CAC" Adresse="   "/>
        <RECEPTEUR Nature="RE" Code="99" Id="123456" Adresse="HGFJHGFJH"/>
        <REF_MESSAGE>7D50A1F0D7D3202</REF_MESSAGE>
        <DATE>2005-10-31T18:20:51</DATE>
    </ENTETE>
    <CORPS>
        <MESSAGE_OFFICINE xmlns="urn:x-csrp:fr.csrp.protocole:message">
            <ENTETE>
                <EMETTEUR Nature_Partenaire="OF" Id_Client="1391002CAC"/>
                <DESTINATAIRE Nature_Partenaire="RE" Code_Societe="99" Id_Societe="123456"/>
            </ENTETE>
            <CORPS>
                <COMMANDE Ref_Cde_Client="6">
                    <NORMALE>
                        <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3341931" Quantite="1"/>
                        <LIGNE_N Num_Ligne="2" Type_Codification="CIP39" Code_Produit="3406033" Quantite="1"/>
                        <LIGNE_N Num_Ligne="3" Type_Codification="CIP39" Code_Produit="3514834" Quantite="1"/>
                    </NORMALE>
                </COMMANDE>
            </CORPS>
        </MESSAGE_OFFICINE>
    </CORPS>
    </CSRP_ENVELOPPE>

  14. #14
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je commence à y voir un peu plus clair et surtout à voir que passer par la méthode classique risque d'être difficile...

    PHP4, PHP5 ?

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    PHP5
    Pourquoi difficile? Je ne m'y suis pas pris correctement?

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    J'aurais tendance à dire (que les pros me confirment ou me contredisent) que le comportement que tu as est normal.
    Quand apache (ou IIS) recoit une requete sur le port 80, il fait un fork afin de délivrer le contenu au client sur un autre port, afin de libérer le 80 et de pouvoir écouter d'autres clients. Si mes souvenirs sont bons.
    Or avec ton script php tu ne fais pas ça. tant que tu traites une requête, tu ne peut accepter celles des autres clients, voila pourquoi un seul peut se connecter en meme temps.

    Je vois donc deux solutions :
    1. tu utilises un serveur web (apache, lighttpd, IIS) qui s'occupera de ce bazar (ils sont fait et étudiés pour ça)
    2. tu réinventes la roue et tu le fais en php ce qui risque de ne pas être simple, d'autant plus que tu es sous windows

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    OK, c'est bien ce qui me semblait mais je n'ai pas réussi à trouver comment interagir avec IIS pour récupérer ces fameuses données?

    J'imagine qu'il faut filtrer les requetes recues par IIS, mais vers quel port renvoyer la réponse? Faut-il que j'abandonne les sockets? Je ne connais pas de fonction php permettant ceci

  18. #18
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Dans une configuration normale, c'est à dire php derrière un vrai serveur web, tu n'as pas à te soucier du port. Si le serveur écoute sur le port 8080, ca ne change rien à ton appli. Il te suffit de faire un echo et c'est apache ou autre qui s'occupe de renvoyer la réponse sur le bon port.

  19. #19
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    ok, donc pour la réponse ça ne change rien.
    Mais pour récupérer les requêtes reçues, il faut bien que je dispose d'une fonction capable de récupérer soit la ressource de la socket utilisée par le serveur web (s'il fonctionne bien ainsi), soit autre chose mais je ne vois pas quoi?

  20. #20
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    J'ai essayer d'envoyer ta requête à apache et il ma répondu "400 Bad Request"

    Ta requête ressemble à du soap. Est-ce que je me trompe ? Peut-etre que ca sera une piste à explorer...

Discussions similaires

  1. [phpMyAdmin] [Configuration] Mise en place d'une configuration multi-utilisateurs
    Par oceane751 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 07/06/2007, 08h25
  2. [URLRewriting] sur une configuration multi-users
    Par goldorax113 dans le forum Apache
    Réponses: 8
    Dernier message: 15/05/2007, 00h32
  3. configuration jboss connexion https
    Par AnneB dans le forum Wildfly/JBoss
    Réponses: 7
    Dernier message: 02/05/2007, 11h44
  4. Comment configurer la connexion ?
    Par Ganak dans le forum Windows XP
    Réponses: 1
    Dernier message: 03/11/2006, 11h43
  5. Réponses: 4
    Dernier message: 30/10/2006, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo