/ 博客 / 1334浏览

PHP函数输出RSS时读取源错误解决方法

在《PHP函数调用输出RSS以及显示最后修改时间》中提到过将RSS源输出到主页显示最新文章列表的方法。一直以来效果不错。但最近时常碰到一个问题是主题或插件升级常因国内服务器与国外联系较慢而导致.maintenance模式出现(“正在执行例行维护,请一分钟后回来”),连带着把主页上的RSS输出也弄砸了,显示很长一串的Warning信息,导致主页的框架会错位,且右边的输出也随之中止,丑陋不堪。

rss error
rss error

经查,主要问题还是出在原主页的php函数上:

//打开rss地址,并读取,读取失败则中止
$fp = fopen($rssfeed[$i],“r”) or die(“can not open $rssfeed”);
while ( !feof($fp) ) {
$buff .= fgets($fp,4096);
}
//关闭文件打开
fclose($fp);

上面的fopen会在or后面输出错误信息并中断脚本执行。 解决方法:

  1. 在fopen前增加@,可以忽略(Warning: fopen fails...)警告信息,也不会导致页面参差不齐。
  2. 把die()函数取消,换成下面的break,继续执行脚本。
  3. 增加if-else函数if($fp==NULL),判断是否输出为空(即无RSS输出)。如空,则@fclose($fp)防止陷入死循环,且在fclose前也增加@可忽略警告信息,然后break。

修改后的RSS函数如下:

//RSS funciton
function rssoutput($feedaddress, $length)
{
        $rssfeed = array($feedaddress);
        //header('Content-Type:text/html;charset= UTF-8'); 
        for($i=0;$i<sizeof($rssfeed);$i++){
        $buff = "";
        $rss_str="";
        //打开rss地址,并读取,读取失败则中止
        //原为$fp = fopen($rssfeed[$i],"r") or die("can not open $rssfeed"); 
        //这里在fopen前增加了@,可以忽略警告信息(Warning: fopen fails...),页面也不会弄的参差不齐了。把die函数取消。
        $fp = @fopen($rssfeed[$i],"r");
        //这里增加了if函数,判断是否输出为空(也就是无RSS输出)。如空,则fclose。在fclose前也增加@,忽略警告信息。然后break。取消了上面的die函数,换成break,可以继续执行脚本。
        if($fp==NULL){
            @fclose($fp);
            print("读取错误,请稍后刷新");
            break;
        }
        else{
            while ( !feof($fp) ) {
            $buff .= fgets($fp,4096);
            }
        //关闭文件打开 
        fclose($fp);
        //建立一个 XML 解析器 
        $parser = xml_parser_create();
        //xml_parser_set_option -- 为指定 XML 解析进行选项设置 
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
        //xml_parse_into_struct -- 将 XML 数据解析到数组$values中 
        xml_parse_into_struct($parser,$buff,$values,$idx);
        //xml_parser_free -- 释放指定的 XML 解析器 
        xml_parser_free($parser);
        foreach ($values as $val) {
        $tag = $val["tag"];
        $type = $val["type"];
        $value = $val["value"];
        //标签统一转为小写 
        $tag = strtolower($tag);
        if ($tag == "item" && $type == "open"){
            $is_item = 1;
        }else if ($tag == "item" && $type == "close") {
        //构造输出字符串 
        $rss_str .= "<li><a href='".$link."' title='".发表于 .$pubDate."' target=_blank>".$title."</a>";
                if (floor((time()- strtotime($pubDate))/(24*60*60)) < 3){
                //$rss_str .= "<img src='images/new.gif' />";
                $rss_str .= "<font color=red font-size='xx-small'> 新</font>";
                }
        $rss_str .= "</li>";
        $is_item = 0;
        }
        //仅读取item标签中的内容 
        if($is_item==1){
        if ($tag == "title") {$title = cut_str($value, $length);} //was 59. Minimum 41
        if ($tag == "link") {$link = $value;}
        if ($tag == "pubdate") {
            $pubDate = date('Y-m-d',strtotime($value));
            //+16*3600
            }
        if ($tag == "description") {$description = cut_str($value, 207);}
        }
        }
        //输出结果 
            echo $rss_str."<br />";
        }
        }
}
?>

效果:

rss error handling
rss error handling

7

  1. Ryu井

    虎哥,我用这个新建了一个temple,但是还是不能用,到底是哪里出问题呢?我用自定义栏目来添加rss feed的,能不能手把手教我用?实在是很笨啊对不起,麻烦你几天了。

    Unknown · Unknown
  2. Ryu井

    虎哥,昨天我自己参照知更鸟的hotnews主题,做成功了,不过比较丑 😀

    Unknown · Unknown
    1. S

      @Ryu井成功便好。网址呢?

      Unknown · Unknown
      1. Ryu井

        @S还是先不说了,重新建一个,什么都没有,等到了好看时再来告诉虎哥你

        Unknown · Unknown
  3. Ryu井

    虎哥,站已建了雏形啦,网址是zhengzexin.com很感谢您,我是真的打算老老实实写博客的,虽然现在什么内容都还没 😀 真惭愧啊,现在正在研究pirobox那种暗箱效果,看到知更鸟视频也可以暗箱,有点手痒

    Unknown · Unknown
    1. S

      @Ryu井去看了,挺好的。博客的关键是日积月累,以内容取胜。多走动啊。

      Unknown · Unknown
      1. Ryu井

        @S谢谢虎哥的赞赏和帮助啊,确实需要日积月累

        Unknown · Unknown

回复 Ryu井 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注