2012-04-10 15 views
1

私はfsockopenとfwriteを使ってデータを送受信しています。私のアプリケーションは適切な応答を受け取りますが、何らかの種類のタイムアウトまで待ってから続行します。私は、応答を受信し終えた後、接続が正常に終了していないと思われます。誰かが私のコードを見てもらえますか?データ受信後にHTTP接続を閉じる

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

あなたは 'timeout'の値で動かしてみましたか? http://us2.php.net/manual/en/function.fsockopen.php –

+0

これが役立つかどうかは不明ですが、http://php.net/manual/en/function.feofの上部にあるメモをご覧ください。 "警告:サーバーによってfsockopen()によって開かれた接続が閉じられなかった場合、feof()はハングします。これを回避するには、下記の例" –

+0

@BenLeeHmmを参照してください。変更は機能していないようです。 30秒間もタイムアウトしています。 – user978122

答えて

1

問題は、この行である:

while (!feof($connection)) { 

ソケットはストリームです。他の側が接続を終了しない限り最初にfeoftrueを返さず、最終的にスクリプトがタイムアウトします。

正常シャットダウンを実行するには、両方のパーティが接続の終了を閉じる必要があります。 一方は、他のものへの応答としてそれを行うことができますが、明らかに両方が他のものを閉じるのを待っている場合は、誰もこれから行いません。

何かを出力した後、反対側のプログラムが接続を閉じますか?そうではないようです。

+0

これで、ヘッダーを解析してコンテンツの長さを取得し、それを使用して接続を厳しくするタイミングを判断しました。 – user978122

+0

@ user978122:サーバーがコンテンツの長さを送信した場合、それを取り除くことができれば良い方法です。乾杯! – Jon

関連する問題