什么是阻塞的fsockopen?(What is blocking fsockopen?)

2019-06-24 05:36发布

挣扎了半天,我终于设法得到验证码通过转换此功能工作:

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失败,“无法打开插座”。 谢谢。

另外 :套接字支持启用。

Answer 1:

我可能是错的,但是你用$port = 80fsockopen()而在卷曲情况下,这个变量根本不使用。 我已经当试图通过连接到SSL同样的问题port 80而不是端口443 ; 据我所知, cURL默认检查SSL和相应的连接。

此外,尝试运行cURLCURLOPT_VERBOSE来看看会发生什么。



Answer 2:

什么是在$错误号和$ errstr内,如果(假=== ...)? 那么,什么是它的输出,如果你改变

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


Answer 3:

谷歌搜索为你的错误导致不知道你的/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 ,使其可读。



Answer 4:

哇,

  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有时。



文章来源: What is blocking fsockopen?