如何解决 cURL 错误(7) : 无法连接到主机?

我使用 cUrl (php)将项目代码以 xml 格式发送到 Web 服务。我在 localhost 中得到了正确的响应,但是当这样做时,服务器会显示出来

CURL 错误(7) : 无法连接到主机

我的原则是:

function xml_post($post_xml, $url)
{
$user_agent = $_SERVER['HTTP_USER_AGENT'];


$ch = curl_init();    // initialize curl handle
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_xml);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//  curl_setopt($ch, CURLOPT_PORT, $port);


$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
if ($curl_errno > 0) {
echo "cURL Error ($curl_errno): $curl_error\n";
} else {
echo "Data received\n";
}
curl_close($ch);


echo $data;
}

我发送的项目代码的理货和获取的细节从它。我试过同时使用 php4 + 和 php5 + 版本,没有任何解决方案。

572570 次浏览

你能通过浏览器或 PHP 脚本访问这个 URL 吗?显示的错误是无法连接。因此,首先确认 URL 是可访问的。

CURL 错误代码7(CURLE _ CoulDNT _ CONNECT)

是非常明确的... 它的意思是 Failed to connect() to host or proxy.

以下代码适用于任何系统:

$ch = curl_init("http://google.com");    // initialize curl handle
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
print($data);

如果你不能看到谷歌网页然后. . your URL is wrong或你有一些 firewallrestriction的问题。

检查端口80和443是否被阻塞,或者输入-IP graph.facebook.com ,然后输入 etc/hosts 文件

“ CURL ERROR 7未能连接到权限拒绝”错误是造成的,当由于任何原因 cURL 请求被某个防火墙或类似的东西阻止。

当 curl 请求没有使用标准端口时,您将面临这个问题。

例如,如果你做一些卷曲到端口1234上的 URL,你将面临这个问题,因为端口80的 URL 将很容易给你结果。

这个错误在 CentOS 和其他任何带有“ SElinux”的操作系统上最常见。

您需要禁用或更改’SElinux’为允许

看看这个

Http://www.akashif.co.uk/php/curl-error-7-failed-to-connect-to-permission-denied

希望这个能帮上忙

如果您试图同时使用多个 HTTP 请求命中相同的 URL,也可以得到这个结果。许多 curl 请求无法连接,因此返回错误

当远程设备上没有配置 https 时,对 https 进行 curl 调用也可能导致此问题。在这些情况下,调用 http 可以解决此问题,至少在您在远程上配置 ssl 之前是如此。

在我的情况下,我有类似 cURL Error (7): ... Operation Timed Out的东西。我正在使用我工作的公司的网络连接。我需要创建一些环境变量。下一个对我很管用:

在 Linux 终端:

$ export https_proxy=yourProxy:80
$ export http_proxy=yourProxy:80

在 windows 中,我用 windows 的方式创建了(相同的)环境变量。

希望能有所帮助!

问候!

在 PHP 中,如果你的网络在代理下。你应该设置代理 URL 和端口

curl_setopt($ch, CURLOPT_PROXY, "http://url.com"); //your proxy url
curl_setopt($ch, CURLOPT_PROXYPORT, "80"); // your proxy port number

这解决了我的问题

在我的案例中,问题是由于我使用的主机提供商阻塞了发送到其 IP 块的 http 数据包,而这些数据包来自其 IP 块内部。难以置信! ! !

如果您尝试了所有的方法,但都失败了,请尝试以下命令:

setsebool -P httpd_can_network_connect on

有几天我完全不知道这件事。我非常非常新的网络/vms,但热衷于尝试建立自己,而不是支付托管公司为我这样做。

背景

我正在为一个应用程序重建服务器端,该应用程序使用 php 例程从内部数据源以及基于地图的应用程序的外部 API 返回各种数据位。我已经启动了一个 Oracle VM 实例,并安装/设置了 Apache 和 php。一切运行良好,直到我的一个 php 例程尝试执行 cURL。我开始实现错误日志记录,发现我甚至没有得到消息-只有’7’,尽管实现非常类似于上述。我的 php 例程访问一个内部文件以获取数据运行正常,所以我相当肯定这不是 Apache 或 php 的问题。我还检查了 Apache 错误日志,没有发现任何问题。

解决方案

我几乎要放弃了-在上面和其他文章中有关于禁用 SELinux 的讨论,我尝试过,它 是的为我的目的工作,但是这里有一篇关于为什么 不应该禁用 SELinux https://www.electronicdesign.com/technologies/embedded-revolution/article/21807408/dont-do-it-disabling-selinux的非常好的文章

如果暂时禁用它的工作和像我一样,你不想这样做(但它确认,SELinux 是阻止你!),我发现了一个简洁的小命令,它实际上以一种更易读的方式打印出 SELinux 问题:

sealert -a /var/log/audit/audit.log

结果如下:


found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------


SELinux is preventing php-fpm from name_connect access on the tcp_socket port 443.


很好,我现在得到了比“7”更多的信息。再往下看,我可以看到它实际上提出了一些建议:

*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************


If you want to allow httpd to can network connect
Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.


Do
setsebool -P httpd_can_network_connect 1

上面已经进一步提到了这一点,但现在我对它的作用有了更多的上下文和解释。我来指挥,我来做生意。此外,我的 SELinux 仍然设置为强制执行,这意味着我的机器更加安全。

还有许多其他的注销建议,如果您被阻止,可能值得注销/检出/var/log/audit.log。