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

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

<code>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;
}
</code>

чтобы:

<code>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;
}
</code>

В основном мне интересно узнать почемуcurl работает покаfsockopen не удается с "Не удалось открыть сокет". Благодарю.

In addition: Поддержка сокетов включена.

 Unni Kris08 июн. 2012 г., 05:57
+ 1 заставил мою recaptcha работать с кодом curl. Можете ли вы сказать, вносили ли вы какие-либо специфические изменения в Recaptcha_check_answer функция тоже
 Question Overflow07 мая 2012 г., 03:39
@ chris, ошибка «php_network_getaddresses: getaddrinfo fail: имя или служба неизвестна». Любая помощь
 Question Overflow07 мая 2012 г., 03:52
@ Крис, я тоже так думал. Но$host это просто "www.google.com".
 goat06 мая 2012 г., 23:12
оператор stfu (@) заставляет замолчать ошибки. Это делает очень трудным выяснить, в чем проблема.
 goat07 мая 2012 г., 03:46
Мое предположение, что ваше значение $ host неверно. см. документацию по fsockopen ()

Ответы на вопрос(4)

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

Это не имеет никакого смысла, конечно. Пытаться

    $fs = fsockopen($host, $port, $errno, $errstr, 10); // @ ignores errors
 if(!$fs) die ("Could not open Socket");

Также Skype также иногда блокирует порт 80.

 Marc B18 сент. 2013 г., 20:22
это имеет смысл. В PHP результатом присваивания является присваиваемое значение. поэтому $ fs получает возвращаемое значение fsockopen, а затем это значение также проверяется на false. Вот как$x = $y = $z = 42; назначит 42 всем трем переменным одновременно.
 nl-x18 сент. 2013 г., 21:53
omg, теперь я тоже ответил на этот вопрос, но не раньше, чем понял, что ты столкнулся с этим 16-месячным вопросом

Googling из-за вашей ошибки задается вопросом, является ли ваш /etc/resolv.conf доступным для чтения PHP. Делатьls -lah /etc/resolv.conf в Bash, чтобы увидеть, если он читается. Вы получите что-то вроде:

lrwxr-xr-x  1 root  wheel    20B 16 mrt  2011 /etc/resolv.conf
       ^ if there is an 'r' here it is readable. if you have '-' here, it is not.

Если это не читается, попробуйте сделать в bash:chmod 644 /etc/resolv.conf чтобы сделать его читабельным.

 Question Overflow19 сент. 2013 г., 05:08
Да, другие уже читают.

$port = 80 вfsockopen() пока в Curl case эта переменная вообще не используется. У меня была такая же проблема, когда пытался подключиться к SSL с помощьюport 80 вместо порта443; насколько я знаю,cURL проверяет SSL по умолчанию и подключается соответственно.

Также попробуйте запуститьcURL с CURLOPT_VERBOSE чтобы увидеть, что он делает.

 Question Overflow28 нояб. 2013 г., 11:40
Спасибо за поздний ответ, но я попробовал с портом 443 на старом коде. Это тоже не работает.

что он выводит, если вы измените на

 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket, error: " . $errstr);
 }
 Question Overflow08 мая 2012 г., 04:35
Он включен.
 Alexey07 мая 2012 г., 12:35
what do <? php echo ini_get ('allow_url_fopen'); ?> говоришь?
 Question Overflow07 мая 2012 г., 03:37
Он говорит: «php_network_getaddresses: getaddrinfo не удалось: имя или служба неизвестна»
 Alexey08 мая 2012 г., 08:58
Что находится в $ host, когда вы выкидываете его перед вызовом fsockopen? Что если вы замените его на его IP? Если вы попытаетесь разрешить это имя хоста прямо на сервере, на котором вы тестируете этот код, он это сделает? Просто попробуйте пропинговать $ host из shell, если у вас есть доступ.
 Question Overflow08 мая 2012 г., 12:06
$host - это "www.google.com" при сбросе доfsockopen вызов. Если заменить его на IP-адрес "74.125.235.52", ошибка исчезнет, но ответ, который я получу отfgets($fs, 1160) это бул (ложь).

Ваш ответ на вопрос