【问题标题】:How to read external rss file?如何读取外部 rss 文件?
【发布时间】:2025-11-30 08:20:05
【问题描述】:

我应该显示来自另一台服务器的 rss 文件中的数据。

当 rss 文件在我的服务器上时,我可以读取它,但是当我尝试在另一台服务器上读取相同的文件时,我会得到这个:

警告: simplexml_load_file(rssfile) [function.simplexml-load-file]:失败 打开流:连接超时 在 索引.php 在第 43 行

警告:simplexml_load_file() [function.simplexml-load-file]:I/O 警告:无法加载外部 实体 “rss 文件” 在 索引.php 在第 43 行

这是我的代码:

$actus = simplexml_load_file('rssfile');  
foreach ($actus->channel->item as $actu) 
{  

echo $actu->title;

} 

如何解决?

我认为问题来自于 Symfony

【问题讨论】:

  • 只是为了确保:您正尝试使用“地址”'rssfile' 从另一台服务器加载文件
  • 是的,“rssfile”是这个“其他”服务器上的文件
  • 那么,怎么会有人知道'rssfile' 在哪里以及如何找到?
  • "是的,'rssfile' 是这个 'other' 服务器上的文件" - 所以,实际上,在你的 real 代码中,你有类似 simplexml_load_file('http://some.host/a/path/foo.rss') 和 @ 987654325@只是你放在那里忘记提及的东西?
  • VolherK:是的。但对我来说,问题来自 Symfony,因为我在“基本”php 文件中尝试了相同的代码,并且它可以工作

标签: php xml symfony1


【解决方案1】:

然后你可以用这样的东西来阅读它......

private static string LoadResource(string rname)
{
    System.IO.Stream s = null;

    try
    {
        s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(rname);
        return new System.IO.StreamReader(s).ReadToEnd();
    }

    finally
    {
        if (s != null)
        {
            s.Dispose();
        }
    }
}

【讨论】:

【解决方案2】:

由于错误/警告消息是“连接超时”,让我们仔细看看超时选项。
default_socket_timeouthttp context option timeout,它们可能是通过stream_context_set_default 设置的。

试试这个

$xmlsrc = 'http://some.host/a/path/foo.rss';
$actus = simplexml_load_file($xmlsrc);
if ( !$actus ) {
  echo "simplexml_load_file() failed.<br />\n";
  echo '$xmlsrc='; var_dump($xmlsrc); echo "<br />\n";
  echo 'default_socket_timeout=', ini_get('default_socket_timeout'), "<br />\n";
  $defaultOptions = stream_context_get_options(stream_context_get_default());
  echo 'default options='; var_dump($defaultOptions); echo "<br />\n";
  die;
}

foreach ($actus->channel->item as $actu) ...

在同一服务器上的两种情况下(使用/不使用 symfony)。 (超时)值是否不同?

【讨论】:

    【解决方案3】:

    我同意 VolkerK,错误来自提供的错误网址。

    此外,由于您使用的是 symfony,我建议您使用 sfFeed2Plugin,它比 simplexml 加载器(验证、输出方法,甚至,如果需要,还提供服务)做得更多。

    这是一个简单的用法示例:

    // define your source url
    $source_url = 'http://feeds.feedburner.com/TechCrunch';
    
    // fetch url
    if($feed = sfFeedPeer::createFromWeb($source_url))
    {
      // get items
      $items = $feed->getItems();
    
      foreach($items as $item)
      {
        // do whatever you want with each item
        echo $item->getTitle()."\n";
      }
    }
    

    【讨论】: