点点细雨 2013年11月26日星期二
为了提高搜索引擎的收录速度,今天开始编写rss源来增加对搜索引擎的友好。
废话就不多打了,毕竟我打字速度也不快(O(∩_∩)O哈哈~)。
本文为原创,转载请注明出处!
一、开始解析rss文件。
下面是百度国内新闻rss的地址: http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss
下面是源文件
很显然这就是一个xml文件 (~ o ~)~zZ
二、浏览器的解析
那么对于这样的一个rss文件,浏览器是怎样解析的呢?
ie8:
QQ浏览器:
傲游:
谷歌:
火狐:
从上边看来,源文件为xml的rss源被浏览器解析成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 .= "
\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设置
本来想在网上找些资料把功能做出来,但是国内技术网站相互抄袭,一个文章内容只要标题一样在所有的网站上都是一样的,这种现象很不好,严重阻碍的技术型网站的进步,所以呢,还是自己研究写出来吧,本着开源的精神跟大家分享,如果那里不好请一定要指出来啊!
谢谢。