2017-07-26 7 views
0

Je veux envoyer des demandes XML via un protocole EPP à un registrar et obtenir des réponses, la connexion est réussie, mais quand j'arrive à fread($fp), il faut une éternité pour charger.Réponse socket fread PHP prend une éternité

Existe-t-il un moyen de le rendre rapide et d'obtenir une réponse du bureau d'enregistrement? J'utilise le code ci-dessous dans un plugin hostbill.

/** open socket* */ 
     $fp = fsockopen("tcp://registrarwebsite.com", 700, $errno, $errstr, 200); 

     stream_set_blocking($fp, true); 

     stream_context_set_option($fp, 'ssl', 'verify_host', true); 
     stream_context_set_option($fp, 'ssl', 'verify_peer', true); 
     stream_context_set_option($fp, 'ssl', 'allow_self_signed', false); 
     stream_context_set_option($fp, 'ssl', 'local_cert', __DIR__ . '/ma_cert.pem'); 
     stream_context_set_option($fp, 'ssl', 'local_pk', __DIR__ . '/ma_key.pem'); 


     // $secure = stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); 
     // stream_set_blocking($fp, false); 

     if (!$fp) { 
      $this->addError('Il y a une erreur dans la connexion: ' . $errno . ' ' . $errstr); 
      return false; 
     } else { 

      $xml = htmlentities($this->prepareXMLRequest($xml)); 

      fwrite($fp, $xml); 

      $out = fread($fp, 1024); 

      fclose($fp); 

      $out1 = htmlentities($fp); 

      $this->addError('<span style="color: green !important">Connexion se fait avec succes, le code retourné est : </span> ' . $out1); 
+0

_dans quoi? Un vaisseau de fusée? – AbraCadaver

+0

Désolé, je n'ai pas compris votre question? – SmootQ

+1

Le titre: "_PHP socket fread réponse prend pour toujours ** dans un ** _", donc _in a_ quoi? Dans une fusée, dans une machine à voyager dans le temps, dans le vide? – AbraCadaver

Répondre

1

Votre EPP mise en œuvre est mauvaise (si le serveur prend en charge la norme à la lettre bien sûr), voir RFC5734 que je cite:

  1. données Format de l'unité

    L'unité de données EPP contient deux champs: un en-tête de 32 bits qui décrit la longueur totale de l'unité de données et l'instance XML EPP. La longueur de l'instance XML EPP est déterminée en soustrayant quatre octets de la longueur totale de l'unité de données. Un récepteur doit lire avec succès plusieurs octets pour extraire l'instance EPP XML complète avant de traiter le message EPP.

Notez également l'article 3 qui montre lorsque vous ouvrez la connexion TCP/TLS la première partie à parler est le serveur avec le <greeting> afin que le client vous devez d'abord de lire que puis envoyez votre connexion.

+0

Merci beaucoup pour votre précieuse réponse, c'était utile ^^ Meilleur +1 – SmootQ