【问题标题】:php file_get_contents cannot read xml servicephp file_get_contents 无法读取 xml 服务
【发布时间】:2010-12-19 10:58:17
【问题描述】:

我想从 url 读取和解析 xml 数据。我的 url 是:“http://xml.gamebookers.com/sports/bandy.xml”。我可以从浏览器访问 xml 数据。但是,当我尝试使用 php 读取它不起作用。它的错误如下:

警告:file_get_contents(http://xml.gamebookers.com/sports/bandy.xml):打开流失败:连接超时

我该如何解决这个问题?有任何 cmets 吗?

提前谢谢..

【问题讨论】:

  • 我建议您执行以下操作:确保文件存在于您尝试打​​开并获取内容的 url。确保 allow_url_fopen 为 ON。
  • 该 url 可用,因为我可以从浏览器访问它,并且 allow_url_fopen 已打开。我尝试了另一种解决方案,例如:我使用带有流参数的 file_get_contents(用于代理),并且我使用了 file_get_contents 的返回值simplexml_load.However file_get_contents 的返回值是字符串,所以 simplexml_load 由于字符串参数而不是 xml 文件参数而出错

标签: php xml file-get-contents


【解决方案1】:

请参阅here 以获得答案:

此错误很可能与 途中有太多 (HTTP) 重定向 从你的脚本到你想要的文件 打开。 default redirection limit should be 20。作为 20 重定向非常多 文件名本身有一些错误 (导致例如网络服务器上的 另一端做一些 拼写检查重定向)或其他 服务器配置错误或存在 一些安全措施到位或...

如果您觉得有必要延长 20 重定向您可以使用流 上下文。

$context = array(
    'http'=>array('max_redirects' => 99)
);
$context = stream_context_create($context);
// hand over the context to fopen()
$data = file_get_contents('http://xml.gamebookers.com/sports/bandy.xml', false, $context);
// ...

请看:

【讨论】:

  • 感谢 Stefan 我通过使用 curl 和代理选项解决了这个问题。我得到了 xml 数据。但是它很慢。有没有办法将参数传递给 xml url?例如:"xml.gamebookers.com/sports/bandy.xml?name=footbal " ?我想使用这样的功能来过滤结果。我不需要整个结果
  • 否 - 至少在 XML 文件确实是 XML 文件时不会。如果它是某种 REST 端点(这意味着该 URL 后面有一个脚本运行),则可以将其他参数传递给 URL。如果它只是一个文件,它将作为文件下载。
【解决方案2】:

试试 sn-p: $request_url = 'http://xml.gamebookers.com/sports/bandy.xml';

$xml = simplexml_load_file($request_url) or die("feed not loading");

/* 然后只需解析出您的 xml 的子节点。 例如 */

foreach($xml->children() as $child) { echo $child->getName().":  ".$child."
"; }

希望有帮助

PS:打开你的 PHP.INI 并寻找 allow_url_fopen = On // 确保它是 ON

【讨论】:

  • 嗨 dbwebtek 感谢您的关心,但我收到以下错误:警告:simplexml_load_file(xml.gamebookers.com/sports/bandy.xml):无法打开流:达到重定向限制,在 /var/www/fbDemo/rss.php 中中止在第 13 行警告:simplexml_load_file():I/O 警告:未能在第 13 行提要未加载的 /var/www/fbDemo/rss.php 中加载外部实体“xml.gamebookers.com/sports/bandy.xml
  • 顺便说一句,我的应用程序位于本地主机中,并且我正在使用代理。没有代理我无法从浏览器访问该 xml 服务
  • 我使用了这样的流(因为我使用的是代理): $default_opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Accept -language: en\r\n" . "Cookie: foo=bar", 'proxy'=>"tcp://myProxyIp:myPort" ) );然后我使用带有流参数的 fie_get_contents() 函数并且它起作用了。但是有什么方法可以在 simple_xml_load 中使用流参数?
  • 我刚刚用代码 sn-p 测试了我的结果,并通过显示日期来获取数据......所以我想它一定是你机器上的配置。我的是 Ubuntu 10.04,全 LAMP 堆叠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多