【发布时间】:2012-05-15 08:41:52
【问题描述】:
苦苦挣扎了半天,终于通过转换这个函数让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 因“无法打开套接字”而失败。谢谢。
另外:已启用套接字支持。
【问题讨论】:
-
stfu 运算符 (@) 可消除错误。这使得找出问题所在非常困难。
-
@chris,错误是“php_network_getaddresses: getaddrinfo failed: Name or service not known”。有什么帮助吗?
-
我猜你的 $host 值不正确。请参阅 fsockopen() 的文档
-
@chris,我也这么认为。但是
$host只是“www.google.com”。 -
+1 让我的 recaptcha 使用 curl 代码。您能否判断您是否也在 recaptcha_check_answer 函数中进行了任何特定于 curl 的更改