PHP Curl无法连接到自己的服务器上的主机

时间:2011-05-10 11:10:23

标签: php apache curl apache2

我有一个PHP脚本,它使用cURL访问位于我的服务器上的文件(已安装的电子邮件营销程序)。我写了一个快速脚本来测试我的cURL安装,当它指向我自己的服务器上的文件时它失败了。脚本是:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/test.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$contents = curl_exec($ch);

if($contents) {
    echo $contents;
} else {
    $err = curl_error($ch);
    echo $err;
}

curl_close($ch);

当我运行此代码时,它会返回错误:无法连接到主机

如果我将网址更改为 http://www.google.com 或任何其他网站,则可以正常使用。此外,当我尝试通过另一台服务器上的cURL打开特定页面时,它的工作方式应该如此。我从这些测试中做出的假设是PHP cURL已经安装并且(有点)工作,并且问题不在试图打开的页面中。

我认为这可能是一个端口问题,所以我尝试使用相同的结果指定端口(不连接到主机)。我尝试了curl_setopthttp://www.mysite.com:80/来指定我知道要打开的端口。

这让我相信这个问题在我的apache安装中有所帮助,但我不是阿帕奇专家,而且我一整天都在猛烈抨击谷歌而无济于事。什么可能导致这种特定cURL失败的想法?

4 个答案:

答案 0 :(得分:2)

遇到同样的问题,我的域名无法在服务器上解析,导致CURL请求自身失败。

我的问题是由于某些防火墙规则,我的Web服务器无法自行解析(Web服务器前面有一个负载平衡器阻止来自服务器的流量)。

换句话说,在我的服务器上运行以下命令

curl -I http://www.mywebserver.com导致:

$ curl -I http://www.mywebserver.com curl: (7) couldn't connect to host

更新服务器上的/ etc / hosts文件以将域名映射到本地IP地址解决了该问题,我的脚本中的fopencurl再次正常运行。

答案 1 :(得分:1)

你可以ping www.mysite.com吗?

检查您的/ etc / hosts ...可能为www.mysite.com指定了错误的IP。

答案 2 :(得分:0)

尝试在网络浏览器中打开http://www.mysite.com/test.php。如果它有效,那么问题在于cURL。如果没有,则问题出在您的网络或apache配置上。

您可以通过确保它在您的系统上运行来检查您的apache配置。然后从命令行尝试telnet <apache server ip> 80。连接后尝试执行以下操作:

GET /test.php HTTP/1.1
Host: www.mysite.com
<2 line breaks>

如果您收到来自apache的回复,那么这听起来像是一个网络问题。确保mysite.com解析为您的apache服务器的IP地址,并且端口80流量可以到达您的服务器。它也可能是您的路由器尝试向其自己的IP地址发出请求的环回路由问题(假设您的apache框位于路由网络连接后面,与您所在的连接相同)。

答案 3 :(得分:0)

我也在远程网络服务器上遇到了这个问题。在这台机器上运行curl我无法在同一台机器上访问由apache服务器托管的文件。奇怪的是我可以通过

访问文件
curl -O http://example.com/file1.txt

curl -0 http://sub.example.com/file1.txt

没用。

我通过将缺少的DNS记录添加到计算机上运行的DNS服务器来解决它。好像nslookup等似乎先问一下本地DNS服务器,然后再问别人。并且当本地DNS服务器回复“无法找到”curl时放弃了。