Вопрос по php – Что блокирует fsockopen?

7

После трудных полдня мне наконец-то удалось заставить работать 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: Поддержка сокетов включена.

оператор stfu (@) заставляет замолчать ошибки. Это делает очень трудным выяснить, в чем проблема. goat
Мое предположение, что ваше значение $ host неверно. см. документацию по fsockopen () goat
@ Крис, я тоже так думал. Но$host это просто "www.google.com". Question Overflow
+ 1 заставил мою recaptcha работать с кодом curl. Можете ли вы сказать, вносили ли вы какие-либо специфические изменения в Recaptcha_check_answer функция тоже Unni Kris
@ chris, ошибка «php_network_getaddresses: getaddrinfo fail: имя или служба неизвестна». Любая помощь Question Overflow

Ваш Ответ

4   ответа
1

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

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

Спасибо за поздний ответ, но я попробовал с портом 443 на старом коде. Это тоже не работает. Question Overflow
0

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

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

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 Overflow
-1

  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.

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

Похожие вопросы