Что такое блокирование 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; } 

чтобы:

 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 терпит неудачу с помощью «Не удалось открыть сокет». Благодарю.

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

Related of "Что такое блокирование fsockopen?"

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

Кроме того, попробуйте запустить cURL с CURLOPT_VERBOSE, чтобы узнать, что он делает.

Что такое $ errno и $ errstr внутри if (false === …)? Итак, что он выводит, если вы переходите на

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

Ого,

  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.

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

 myserver:~ myname$ ls -lah /ets/resolv.conf 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 чтобы сделать его доступным для чтения.