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


How to resolve cURL Error (7): couldn't connect to host?

我使用 cUrl(php( 以 xml 格式将项目代码发送到 Web 服务。我在本地主机中得到了正确的响应,但是什么时候它会显示服务器

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

我将项目代码发送到计数并从中获取详细信息。我尝试同时使用php 4+和php5 +版本,没有任何解决方案。

卷曲错误代码 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问题。

由于任何原因curl请求被某些防火墙或类似的东西阻止时,会导致"CURL错误7无法连接到权限被拒绝"错误。

当 curl 请求不使用标准端口时,您将面临此问题。

例如,如果您确实卷曲到端口 1234 上的某个 URL,您将面临此问题,因为带有端口 80 的 URL 将轻松为您提供结果。

最常见的是,这个错误出现在 CentOS 和任何其他带有"SElinux"的操作系统上。

您需要禁用或将"SElinux"更改为宽松

看看这个

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

希望这有帮助

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

setsebool -P httpd_can_network_connect on

在 PHP 中,如果您的网络处于代理状态。您应该设置代理 URL 和端口

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

这解决了我的问题

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

在 Linux 终端中:

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

在窗口中,我以窗口方式创建了(相同的(环境变量。

我希望它有所帮助!

问候!

您是否可以通过浏览器或PHP脚本访问该URL?显示的错误是您无法连接。因此,请首先确认该 URL 是可访问的。

检查端口 80 和 443 是否被阻止。 或输入 - IP graph.facebook.com 并将其输入到 etc/hosts file

此问题也可能是由于在远程设备上未配置 https 时对 https 进行 curl 调用引起的。在这些情况下,通过 http 调用可以解决此问题,至少在远程上配置 SSL 之前是这样。

就我而言,问题是由我使用的托管服务提供商引起的,该托管服务提供商阻止了源自其IP块内的IP块的http数据包。 难以置信!!

几天来,我完全被封锁了。我对网络/VM非常陌生,但渴望尝试自己设置它,而不是付钱给托管公司为我做。

上下文

我正在为一个应用程序重建服务器端,该应用程序使用 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/audit.log。

在终端上执行命令setebool -P httpd_can_network_connect on

如果您白色尝试从浏览器并显示类似"curl 错误 7:无法连接到 172...**:权限被拒绝",然后尝试从终端,如"http://172****"。如果它从终端工作,则运行此命令。

sudo setsebool httpd_can_network_connect 1

然后再次从浏览器尝试。希望会奏效。从我身上工作。