php编写RSS源

记编写rss

点点细雨     20131126日星期二

 

为了提高搜索引擎的收录速度,今天开始编写rss源来增加对搜索引擎的友好。

废话就不多打了,毕竟我打字速度也不快(O(_)O哈哈~)。


本文为原创,转载请注明出处!

 

一、开始解析rss文件。

 

下面是百度国内新闻rss的地址: http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss

 

下面是源文件

 rss源文件

 

很显然这就是一个xml文件 (~ )~zZ

 

二、浏览器的解析

 

那么对于这样的一个rss文件,浏览器是怎样解析的呢?

 

ie8:

 ie8的rss解析

 

QQ浏览器:

 

 

 

傲游:

 

 傲游

 

 

 

谷歌:

 谷歌

 

 

火狐:

 

 火狐

 

从上边看来,源文件为xmlrss源被浏览器解析成rss源,就直接可以通过浏览器订阅啦,请无视那个放弃rss功能的谷歌吧! T_T

 

三、编写:

 

分析源代码,掌握结构

 注释

 

 

我们要做的就是从我们的网站上获取到新闻并添加到rss中。

 

我们参考的方法是phpcms中百度网站地图的生成方式

 

下面分析下流程

 

1.创建xml文件头

2.写入新闻

3.加上xml文件结尾

 

这是创建的步骤,那么我们提交的rss网址的控制器流程呢,当然不能每次打开rss都要进行一次查询数据库,所以我们把rss存入文件中,让控制器直接打开文件,减少服务器压力。


我的项目是基于thinkphp的,下面是我的控制器,大家一看就明白了


代码


header = "<\x3Fxml version=\"1.0\" encoding=\"utf-8\"\x3F>\n";
        $this->footer = "\n\n";
        $this->rss="";
    }
    
    public function rss(){
        $config= require './config.php';	//网站配置
         $rss_file = $rss_path . 'rss.xml';
         if(file_exists($rss_file)){
             $rss=  file_get_contents($rss_file);
             echo $rss;
         }else{
             $put= $this->index();
             $this->rss();
         }
    }

    public function index() {
        $config= require './config.php';	//网站配置
        //var_dump($config);
        $this_domain=$config['web_url'];
       //获取rss配置信息
        $rss_path=$config['rss_path'];
        $title=$config['rss_title'];
        $img_title=$config['rss_img_title'];
        $img_link=$config['rss_img_link'];
        $img_url=$config['rss_img_url'];
        $description=$config['rss_description'];
        $link=$config['rss_link'];
        $language=$config['rss_language'];
        $docs=$config['rss_docs'];
        $generator=$config['rss_generator'];
        $ttl=$config['rss_ttl']; //文章数量
        $NewsDB=D("News");
        $newsList=$NewsDB->getAllNews("","news_id desc",$ttl);
        //var_dump($newsList);
        //循环每条新闻,分别放入数组
         $SourceDB = D("Source");
         $items=array();
        foreach ($newsList as $key => $value) {
            $date=  date("Y:m-d H:i:s",$value['news_publish_time']);
            //获取来源
              $sourceL=$SourceDB->getSource("so_id = ".$value['so_id']);
              $source=$sourceL['so_name'];
              $url=$this_domain.U('/Home/Index/content',array('id'=>$value['news_id']));
              $item= $this->item($value['news_title'],$url,$date,$source,$value['news_author'],$value['news_intro']);
             // var_dump($item);
             $items[]=$item;
        }
        //var_dump($this->items);
     //   var_dump($_SERVER['DOCUMENT_ROOT']);
         $rss_file = $_SERVER['DOCUMENT_ROOT'].$rss_path . 'rss.xml';
        // echo $rss_file;
         @mkdir($dir, 0777, true);
       $result=  $this->rss_build($items,$rss_file, $title, $img_title, $img_link, $img_url, $description, $link, $language, $docs, $generator, $ttl);
       // $this->success("生成站点地图成功");
         //$file=fopen($rss_file,"r") or exit("Unable to open file!");
        // var_dump($result);
        // echo $result;
    }

    /**
     *  rss源的结构
     * @param type $title
     * @param type $link
     * @param type $pubDate
     * @param type $source
     * @param type $author
     * @param type $description
     * @return type 数组
     */
    private function item($title, $link = '', $pubDate = '', $source = '', $author= '', $description = '') {
        $data = array();
        $data['title'] = $title;
        $data['link'] = $link;
        $data['description'] = $description;
        $data['author'] = $author;
        $data['source'] = $source;
        $data['pubDate'] = $pubDate;
        return $data;
    }

    /**
     * 生成xml
     * @param type $file_name
     * @param type $this_domain
     * @param type $email
     * @param type $time
     * @return type
     */
    private function rss_build($items,$file_name = null,$title="",$img_title='',$img_link='',$img_url='',$description='',$link='', $language='zh-cn',$docs='', $generator='', $ttl='') {
        //百度头部
        $this->rss = '';
        $this->rss = $this->header;
        $this->rss .= "" . $title . "\n";
        $this->rss .= "\n".$img_title."\n\n".$img_link ."\n". $img_url ."\n";
        $this->rss .= "".$description."\n";
        $this->rss .= "".$link."\n";
        $this->rss .= "" . $language . "\n";
        $this->rss .= "" . $docs . "\n";
        $this->rss .= "". $generator . "\n";
        $this->rss .= "" . $ttl . "\n";
        foreach ($items as $item) {
            $this->rss .= "\n";
            $this->rss .= "<![CDATA[" . $item['title'] . "]]>\n";
            $this->rss .= "\n";
            $this->rss .= " \n";
            $this->rss .= "\n";
            $this->rss .= "\n";
            $this->rss .= "\n"; 
            $this->rss .= "\n";
        }
        $this->rss .= $this->footer . "\n";
        if (!is_null($file_name)) {
            return file_put_contents($file_name, $this->rss);
        } else {
            return $this->rss;
       }
    }

}


 四、完善功能


当然,做完上面的还不算完整,为了保证可扩展性,我把rss的标题之类的都做成了配置文件,可以直接通过后台来修改。

 'rss_path'=>'/tisumoon/',
    'rss_title'=>'天树网新闻站',
    'rss_img_title'=>'天树网',
    'rss_img_link'=>'http://www.tisumoon.com/',
    'rss_img_url'=>'',
    'rss_description'=>'自媒体新闻网站。',
    'rss_link'=>'http://www.tisumoon.com/',
    'rss_language'=>'zh-cn',
    'rss_docs'=>'',
    'rss_generator'=>'http://www.tisumoon.com/',
    'rss_ttl'=>'10',





网站RSS设置








RSS订阅信息设置
订阅标题
图片提示
图片链接
图片路径
网站链接
网站描述
语言
docs
源网站
新闻条数
Rss文件存放路径

五、后记

本来想在网上找些资料把功能做出来,但是国内技术网站相互抄袭,一个文章内容只要标题一样在所有的网站上都是一样的,这种现象很不好,严重阻碍的技术型网站的进步,所以呢,还是自己研究写出来吧,本着开源的精神跟大家分享,如果那里不好请一定要指出来啊!


谢谢。


 

你可能感兴趣的:(编程技术,#,团队开发那些事儿,#,PHP问题集锦)