PHP:file_get_contents($loc) 失败

13

我将一个项目从本地主机移动到远程服务器,发现一些脚本停止工作。最重要的是,其中一个脚本依赖于file_get_contents()函数从另一个脚本中获取JSON值。

PHP版本为5.2.4
allow_url_fopen为ON

警告:file_get_contents()[function.file-get-contents]php_network_getaddressesgetaddrinfo failed: Name or service not known in /var/www/html/2009/functions/functions.products.php on line 5

警告:file_get_contents(http://data.example.com/new-data.php) [function.file-get-contents]:无法打开流:Success in /var/www/html/2009/functions/functions.products.phpline 5

该脚本正在运行于:http://www.example.com
传递给函数的位置为:http://data.example.com/new-data.php

注意:相同的域名,但两个不同的服务器。

function getData() {
  $location = "http://data.mysite.com/new-data.php";
  $contents = file_get_contents($location);
  $jsonVars = json_decode($contents);
  return $jsonVars
}

你的错误日志中肯定有错误,或者返回了某些东西。需要更多信息。 - Philip Reynolds
如果new-data.php与调用它的脚本在同一台服务器上,为什么不直接传递路径而不是URL呢? - Paolo Bergantino
另外,你是否有使用 error_reporting(E_ALL);? - Paolo Bergantino
@Paolo,是的,我有error_reporting(E_ALL)。这个脚本不在同一台服务器上。 - Sampson
显示错误信息也被启用了吗? - Gumbo
@Gumbo,不是的。我现在收到了一个警告。我会更新我的帖子。 - Sampson
5个回答

18

名称或服务未知

DNS出故障了。你能否在机器上的shell中(如果你有一个的话)ping一下 data.mysite.com

现在尝试用一个固定的IP地址替换 data.mysite.com


现在我们有了进展。找不到它。 - Sampson
你能否从服务器上通过名称访问任何网站?例如 ping google.com。如果不能,那么你可能在 /etc/resolv.conf 中缺少一些名称服务器设置。 - bobince
这就是了。我只需要用 IP 地址替换 URL。谢谢。 - Sampson
3
我建议解决DNS问题,不要在代码中硬编码IP地址。根据您的托管情况,这样做可能会绕过一些负载平衡或容错路由配置。此外,这样做将更容易进行未来的更改,甚至可以独立于主机。 - Nolte
最好的方法是使用 exec() 函数。 - Eugene
我也遇到了同样的问题。我有一个运行着Apache服务器的虚拟机,以前一直能用。问题是我的虚拟机没有网络访问权限。 - Rudolf Real

7

你也可以尝试使用curl:

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, 'http://url.url');
$result = curl_exec($curl);
curl_close($curl);

你可以在$result中获得你想要的结果。


2
请查看远程服务器上的/etc/hosts文件。如果它是空的,您需要添加“127.0.0.1 localhost”的内容。
除非它是VPS的某种变体,其中环回接口连接到外部机器;在这些情况下,您需要使用您的VPS IP号码代替127.0.0.1。

本地主机(LH)、新主机(NH)和数据提供者(DP)。这是涉及到的三台机器。LH可以从DP获取数据,但NH不能。你是说我需要检查NH或DP的/etc/hosts吗? - Sampson
为虚拟机添加所有子域名到 /etc/hosts 文件中: 127.0.0.1 localhost 127.0.0.1 subdomain1.localhost localhost 127.0.0.1 subdomain2.localhost localhost - Vlad

1
如果您确定不是DNS问题,请尝试重新启动Apache。在我经过20分钟的头脑风暴后,这个方法解决了我的问题。

0
请提供更多信息,$contents 包含什么内容?如果您想将其作为 PHP 数组使用,请记得执行 json_decode($contents, true),否则将返回 stdClass。
它是否存在解析主机名的问题?data.mysite.com 是否与 mysite.com 是同一台机器?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接