2012-04-10 8 views
1

Ich sende und empfange Daten mit fsockopen und fwrite. Meine Anwendung erhält die richtige Antwort, scheint jedoch bis zu einer gewissen Zeit abzuwarten, bevor sie fortfährt. Ich vermute, dass ich die Verbindung nicht richtig schließe, nachdem sie die Antwort erhalten hat, was das Warten erklärt. Könnte sich jemand meinen Code ansehen?Schließen einer HTTP-Verbindung, nachdem Daten empfangen wurden

private static function Send($URL, $Data) { 
      $server = parse_url($URL, PHP_URL_HOST); 
      $port = parse_url($URL, PHP_URL_PORT); 

      // If the parsing the port information fails, we will assume it's on a default port. 
      // As such, we'll set the port in the switch below. 
      if($port == null) { 
       switch(parse_url($URL, PHP_URL_SCHEME)) { 
        case "HTTP": 
         $port = 80; 
         break; 
        case "HTTPS": 
         $port = 443; 
         break; 

       } 
      } 

      // Check if we are using a proxy (debug configuration typically). 
      if(\HTTP\HTTPRequests::ProxyEnabled) { 
       $server = \HTTP\HTTPRequests::ProxyServer; 
       $port = \HTTP\HTTPRequests::ProxyPort; 
      } 

      // Open a connection to the server. 
      $connection = fsockopen($server, $port, $errno, $errstr); 
      if (!$connection) { 
       die("OMG Ponies!"); 
      } 

      fwrite($connection, $Data); 

      $response = ""; 
      while (!feof($connection)) { 
       $response .= fgets($connection); 
      } 
      fclose($connection); 

      return $response; 
     } 
+0

Haben Sie versucht, mit dem 'Timeout'-Wert zu spielen? http://us2.php.net/manual/en/function.fsockopen.php –

+0

Nicht sicher, ob dies hilft, aber schauen Sie sich die Notiz an der Spitze von http://php.net/manual/en/function.feof .php unter der Überschrift "Warnung: Wenn eine Verbindung, die von fsockopen() geöffnet wurde, nicht vom Server geschlossen wurde, wird feof() hängen bleiben. Um dies zu umgehen, siehe unten" –

+0

@BenLee Hmm. Die Änderung scheint nicht zu funktionieren. Dauert immer noch 30 Sekunden bis zum Timeout. – user978122

Antwort

1

Das Problem ist mit dieser Linie:

while (!feof($connection)) { 

Sockets Ströme sind; es sei denn, die andere Seite schließt die Verbindung zuerst, feof wird nie zurück true und Ihr Skript wird schließlich Timeout.

Um eine geordnete Abschaltung durchzuführen, müssen beide Parteien ihr Ende der Verbindung schließen; ein von ihnen kann es als eine Antwort auf die andere tun, aber klar, wenn beide darauf warten, dass der andere zuerst dann dann niemand jemals wird.

Schließt das Programm auf der anderen Seite die Verbindung, nachdem etwas ausgegeben wurde? Es scheint nicht.

+0

Ich analysiere jetzt die Kopfzeile, um die Inhaltslänge zu erhalten, und benutze diese, um zu bestimmen, wann die Verbindung ernsthaft sein soll. – user978122

+0

@ user978122: Das ist ein guter Weg, wenn Sie es abziehen können (was bedeutet, wenn der Server die Inhaltslänge sendet). Prost! – Jon

Verwandte Themen