7

经过半天的努力,我终于设法通过转换这个函数来让 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;
}

基本上,我很想知道为什么curlfsockopen“无法打开套接字”失败时工作。谢谢。

另外:启用了套接字支持。

4

4 回答 4

1

我可能是错的,但是你在cURL$port = 80的情况下使用infsockopen()而这个变量根本没有使用。尝试通过而不是端口连接到SSL时,我遇到了同样的问题;据我所知,默认情况下会检查SSL并进行相应的连接。port 80443cURL

另外,尝试使用 CURLOPT_VERBOSE 运行cURL查看它的作用。

于 2013-11-28T08:50:33.537 回答
0

谷歌搜索你的错误会让人怀疑你的 /etc/resolv.conf 是否可以被 PHP 读取。在 bash 中执行ls -lah /etc/resolv.conf以查看它是否可读。你会得到类似的东西:

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中执行以使其可读。

于 2013-09-18T19:43:34.077 回答
0

if(false === ...) 里面的 $errno 和 $errstr 是什么?那么,如果您更改为,它会输出什么

 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
  die ("Could not open socket, error: " . $errstr);
 }
于 2012-05-06T21:09:39.107 回答
-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。

于 2013-09-18T18:17:21.233 回答