Что блокирует fsockopen?

После полдня борьбы мне наконец удалось заставить reCAPTCHA работать, преобразовав эту функцию:

function _recaptcha_http_post($host, $path, $data, $port = 80) {

 $req = _recaptcha_qsencode ($data);

 $http_request  = "POST $path HTTP/1.0\r\n";
 $http_request.= "Host: $host\r\n";
 $http_request.= "Content-Type: application/x-www-form-urlencoded;\r\n";
 $http_request.= "Content-Length: ". strlen($req). "\r\n";
 $http_request.= "User-Agent: reCAPTCHA/PHP\r\n";
 $http_request.= "\r\n";
 $http_request.= $req;

 $response = "";
 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket");
 }

 fwrite($fs, $http_request);

 while ( !feof($fs) )
  $response.= fgets($fs, 1160); // One TCP-IP packet
 fclose($fs);
 $response = explode("\r\n\r\n", $response, 2);
 return $response;
}

to:

function _recaptcha_http_post($host, $path, $data, $port = 80) {
 $req = _recaptcha_qsencode ($data);
 $request = curl_init("http://".$host.$path);

 curl_setopt($request, CURLOPT_USERAGENT, "reCAPTCHA/PHP");
 curl_setopt($request, CURLOPT_POST, true);
 curl_setopt($request, CURLOPT_POSTFIELDS, $req);
 curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

 $response = curl_exec($request);
 return $response;
}

По сути, мне интересно узнать, почему curlработает, а fsockopenне работает с сообщением «Не удалось открыть сокет». Спасибо.

Кроме того,:Поддержка сокетов включена.

7
задан Question Overflow 7 May 2012 в 01:55
поделиться