Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么是开放的?_Php_Curl_Fsockopen - Fatal编程技术网

Php 什么是开放的?

Php 什么是开放的?,php,curl,fsockopen,Php,Curl,Fsockopen,经过半天的努力,我终于通过转换此函数使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-Typ

经过半天的努力,我终于通过转换此函数使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;
}
致:

基本上,我感兴趣的是找出为什么
curl
有效,而
fsockopen
因“无法打开套接字”而失败。谢谢


此外:已启用套接字支持。

如果(=false===…)则$errno和$errstr中的内容是什么?那么,如果您更改为,它会输出什么

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

这毫无意义。尝试:

    $fs = fsockopen($host, $port, $errno, $errstr, 10); // @ ignores errors
 if(!$fs) die ("Could not open Socket");
Skype有时也会阻塞端口80。

因为您的错误会让人怀疑您的/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
以使其可读。

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


另外,尝试使用CURLOPT\u VERBOSE运行
cURL
,查看它的功能。

stfu操作符(@)使错误静音。这使得很难找出问题所在。@chris,错误是“php\u network\u getaddresses:getaddrinfo失败:名称或服务未知”。有什么帮助吗?我猜你的$host值不正确。请参阅fsockopen()@chris的文档,我也这么认为。但是,
$host
只是“www.google.com”。+1让我的recaptcha处理curl代码。您能告诉我您是否在recaptcha_check_answer函数中做了任何特定于curl的更改,它说“php_network_getaddresses:getaddrinfo failed:Name或service not known”是什么意思吗?在fsockopen调用之前转储$host时,它的值是多少?如果用它的IP替换它呢?如果您试图在测试此代码的服务器上解析此主机名,它会这样做吗?如果您有访问权限,请尝试从shell ping$host。
fsockopen
调用之前转储时,
$host
是“www.google.com”。如果我用ip地址“74.125.235.52”替换它,错误就会消失,但是我从
fgets($fs,1160)
得到的响应是bool(false)。如果你从服务器外壳(你有权访问它吗?)ping google.com,它是否解析为ip?这是有意义的。在PHP中,赋值的结果就是被赋值的值。因此,$fs获取fsockopen的返回值,然后该值也会根据false进行测试。这就是为什么
$x=$y=$z=42
会一次将42分配给所有三个变量。天哪,现在我也回答了这个问题,但之前我意识到你提出了这个16个月的问题:)谢谢你的迟来的回答,但我在旧代码上尝试了端口443。它也不起作用。
    $fs = fsockopen($host, $port, $errno, $errstr, 10); // @ ignores errors
 if(!$fs) die ("Could not open Socket");
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.