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


70

我使用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;
}

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


选择使用端口80的代理

使用curl verbose选项获取更多信息
Preexo 2014年

我将在此处添加两件事,最终使我的问题得到解决:1.使用--verbose2从命令行运行cURL 。
Stephen O'Flynn

Answers:


49

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问题。


我可以看到Google页面。但是,然后我在localhost中使用相同的URL,就可以正常工作了。
拉吉2012年

它是您的网址...您能给我一个示例网址,让我为您测试吗
巴巴2012年

1
我认为这不是公共可用的ip地址network-tools.com/… 具有32字节数据的Ping 122.165.82.61:请求超时。请求超时。请求超时。请求超时。
巴巴2012年

4
@巴巴你说:If you can not see google page then .. your URL is wrong or you have some firewall or restriction issue.可能存在什么样的限制?
hpaknia

1
@hpaknia,谢谢,有时我们看不到明显的东西。作为对您的回答的补充,在Linux系统中,请记住检查有关Web服务对正在执行的文件的访问的ACL和SELinux权限。
Jorge_Freitas

24

当由于某种原因,某些防火墙或类似物阻止了curl请求时,将引发“ CURL ERROR 7无法连接到权限被拒绝”错误。

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

例如,如果您确实卷曲到端口1234上的某个URL,则会遇到此问题,因为端口80的URL可以轻松为您提供结果。

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

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

看看这个

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

希望这可以帮助


3
但是Mac系统怎么样
MeganZhou

7
禁用SELinux是过大的,会对其他领域的安全性产生负面影响。您可以通过更改终端上的特定选项来明确允许已知端口以外的端口:setsebool -P httpd_can_network_connect上
Matthew Erwin,

是否有标准端口列表,因此curl不会引发此错误?
Michael Radionov

就我而言,该服务器具有允许连接的列表,并阻止该列表中未包含的所有连接
jking 20'Jan

setsebool -P httpd_can_network_connect on不适用于我(在Centos 8上,每当禁令/取消禁令触发时,尝试使fail2ban卷曲到webhook)。您必须在任何特定的当前目录上调用此命令,还是将其从任何目录应用selinux bool?
bigp


4

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

在Linux终端中:

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

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

希望对您有所帮助!

问候!


是yourproxy - 127.0.0.1
Flyn西奎拉

4

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

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

这是解决我的问题


2

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


3
是的 从本地主机我可以访问它。我在浏览器中对其执行ping操作,并对其进行ping操作。
拉吉2012年

1

检查端口80和443是否被阻塞。或输入-IP graph.facebook.com并在etc / hosts文件中输入


1

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


1

如果未在远程设备上配置对https的curl调用,也可能导致此问题。在这些情况下,至少在远程配置ssl之前,通过http调用可以解决此问题。


1

在我的情况下,问题是由托管服务提供商引起的,因为我使用的是阻止发给其IP块的HTTP数据包,这些HTTP数据包源自其IP块。难以相信的!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.