После того, как я боролся полдня, мне, наконец, удастся заставить 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
терпит неудачу с помощью «Не удалось открыть сокет». Благодарю.
Кроме того : включена поддержка сокетов.
Возможно, я ошибаюсь, но вы используете $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
чтобы сделать его доступным для чтения.