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;
}

基本的に、「ソケットを開けませんでした」curlで失敗するのになぜ機能するのかを知りたいです。fsockopenありがとう。

さらに: Sockets Support が有効になっています。

4

4 に答える 4

1

私は間違っているかもしれませんが、cURLの場合、この変数はまったく使用されません$port = 80。port の代わりにSSLに接続しようとしたときに同じ問題が発生しました。私の知る限り、デフォルトでSSLをチェックし、それに応じて接続します。fsockopen()port 80443cURL

また、CURLOPT_VERBOSEcURLで実行してみて、その動作を確認してください。

于 2013-11-28T08:50:33.537 に答える
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 に答える
0

エラーをグーグルで検索すると、PHP が /etc/resolv.conf を読み取れるかどうか疑問に思います。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 に答える