2012-08-03 125 views
0

我正在用etsy的開放源代碼statsd library設置我的PHP腳本報告。 我基於他們給出的示例建立了連接,但是我遇到了一個問題,它似乎fsockopen忽略了try/catch並正在打印其錯誤。當statsd服務器啓動並運行無法讓PHP fsockopen忽略錯誤

一切正常,盛大 - 但如果它下來或PHP腳本無法連接到它:

Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: 
Name or service not known 

我甚至試圖在的fsockopen前面添加@,但沒有骰子。這似乎也完全無視超時設置,因爲它需要大約20秒返回錯誤:

 try { 
      $host = 'stats.thisserverisdown.com'; 
      $port = '8125'; 
      if ($fp = @fsockopen("udp://$host", $port, $errno, $errstr, 1)) { 
       if (!(get_resource_type($fp) == 'stream')) { return false; } 
       stream_set_timeout($fp,1); 
       stream_set_blocking($fp,false); 
       foreach ($sampledData as $stat => $value) { 
        @fwrite($fp, "$stat:$value"); 
       } 
       @fclose($fp); 
      } 
      return true; 
     } catch (Exception $e) { 
      return false; 
     } 

回答

1

fsockopen不引發錯誤。由於fsockopen必須解析您提供的主機名,因此它會調用getaddinfo(),這是失敗的。

嘗試提供一個IP地址,或者:

fsockopen(@"udp://$host", ...