|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
会有很多高手的鼓励,新手的支持,慢慢你劲头就十足,有更多的信心和兴趣去学。 信任关于良多人来讲,经由过程Bloglines,Google Reader这些浏览器定阅和阅读Blog已是收集生涯的一部分。假如你盘算本人打造一个好用的Feed Reader,无妨尝尝Zend_Feed这个好用的类库。
起首也许的道理是读取Blog的RSS或Atom Feed,失掉XML文件,解析该文件失掉数据。为了加速阅读速度,咱们凡是需求把失掉数据保留到当地数据库中。
以上目标分化成手艺步调有以下三步:
1。读取RSS。 你可使用现成的函数或专业的RSS类库(这类类库普通还供应更多丰厚的功效),也能够本人摹拟HTTP来抓取;
在PHP中,利用复杂的好比file_get_contents()函数就能够便利并且高效地抓取文件,但有时分能够RSS文件是不克不及直接获得的,好比获得你的Bloglines帐号中定阅的RSS,那末能够你还需求提交一些参数或经由过程HTTP认证之类,这时候可用摹拟HTTP的办法,好比上面代码利用了PEAR::Http_Request:
function getRSS($username,$password,$s,$n=0){
$url = "http://rpc.bloglines.com/getitems?s=".$s."&n=".$n;
$req = & new HTTP_Request($url);
$req->setBasicAuth($username,$password);
$req->sendRequest();
$blogContent = $req->getResponseBody();
return $blogContent;
}
填入你的Bloglines帐号和暗码,使用这个函数你就能够失掉RSS文件。
2。解析XML RSS文件遵守必定标准,你可以本人写个函数来解析,没甚么难度,但有点繁琐。
3。将解析失掉的数据入库。
好了,也许晓得了要做的任务,你会发明固然都不难,然而本人一个个完成对照费事,呵呵。这就是本文要引见Zend_Feed的缘由。
Zend_Feed是Zend Framework中的一个类库,咱们完整可以把它独自拿出来利用。Zend_Feed高度封装,利用十分便利,例如读取一个RSS Feed:
$channel = new Zend_Feed_Rss('http://rss.example.com/channelName');
echo $channel->title();
//遍历纪录
foreach ($channel as $item) {
echo $item->title() . "\n";
}
是否是十分复杂? 读取息争析总共5行代码。
好,上面咱们入手下手完成一个真实的Feed Reader:
FeedReader.php
<?php
set_time_limit(0);
define('ZEND_DIR','/www/lib');
set_include_path(get_include_path().PATH_SEPARATOR.ZEND_DIR);
require_once('Zend.php');
Zend::loadClass('Zend_Feed');
Zend::loadClass('Zend_Filter_Input');
$link = mysql_connect('localhost', 'user', 'pwd')
or die('Could not connect: ' . mysql_error());
//echo 'Connected successfully';
mysql_select_db('phpeye') or die('Could not select database');
$feedChannel = array(
'http://www.phpdeveloper.org/phpdev.rdf',
'http://www.planet-php.net/rss/'
);
foreach ($feedChannel as $channel) {
readRssFeed($channel);
}
echo "Done!";
function readRssFeed($feedAddress){
try {
$rss = Zend_Feed::import($feedAddress);
} catch (Zend_Feed_Exception $e) {
// Feed 导入掉败
//echo "Exception caught importing feed: {$e->getMessage()}\n";
$msg = "Exception caught importing feed: {$e->getMessage()}\n ";
$dateTime = date("Y-m-d H:i:s",time());
$errMsg = $msg.' '.$dateTime."\n\n";
echo $errMsg;
file_put_contents('FeedReader.log',$errMsg,FILE_APPEND);
exit;
}
// 初始化保留 channel 数据的数组,$rss外部数据只能经由过程挪用类办法才干会见
$channel = array(
'title' => $rss->title(),
'link' => $rss->link(),
'description' => $rss->description(),
'items' => array()
);
$count=0;
// 轮回取得channel的item并存储到相干数组中
foreach ($rss as $item) {
$channel['items'][] = array(
'title' => $item->title(),
'link' => $item->link(),
'description' => $item->description()
);
//题目和内容都需求本义
$title = strip_tags(mysql_real_escape_string($item->title()));
$link = strip_tags($item->link());
$description = mysql_real_escape_string($item->description());
//先查询数据库看纪录是不是已存在,存在则不操作,不然向数据库添加新纪录
$query = "select * from feedentry where entitle = '$title'";
//echo "<HR>SQL: ".$query."<P>\n\r";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$num_rows = mysql_num_rows($result);
if($num_rows > 0) {
//echo "The record already exists! ";
//do nothing...
}else{
$query = "insert into feedentry (entitle,link,endescription,addtime) values ('$title','$link','$description',NOW())";
//echo "<HR>SQL: ".$query."<P>\n\r";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$count++;
}
}
//zend::dump($channel);
$dateTime = date("Y-m-d H:i:s",time());
if($count>0){
$Msg = $count." entrys read successfully! ".$dateTime."\n\n";
echo $Msg;
file_put_contents('FeedReader.log',$Msg,FILE_APPEND);
}else{
$Msg = 'read nothing...'.$dateTime."\n\n";
echo $Msg;
file_put_contents('FeedReader.log',$Msg,FILE_APPEND);
}
}
?>
文件中除RSS读取,解析和入库外,还有DEBUG和日记功效。
数据表布局以下:
CREATE TABLE `feedentry` (
`id` int(11) NOT NULL auto_increment,
`entitle` varchar(200) NOT NULL default '',
`link` varchar(200) NOT NULL default '',
`endescription` mediumtext NOT NULL,
`category` varchar(50) NOT NULL default '',
`comments` text NOT NULL,
`publishtime` datetime NOT NULL default '0000-00-00 00:00:00',
`addtime` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) TYPE=MyISAM ;
呵呵,把这个文件保留。然后使用Linux的Cron剧本让它准时在号令行下运转,上面让它每小时的40分运转一次:
crontab -e
40 * * * * /usr/local/bin/php -q /www/phpeye/FeedReader.php
一个好用的Feed Reader就打造完成了。假如你想添加RSS频道,可以本人在$feedChannel这个数组中添加元素,十分便利,固然假如你有乐趣,可以写一个WEB界面来办理,那样就更便利了。
改善:
这个Reader已具有了中心功效,然而没有完成频道办理功效,你可以再建一个feedchannel数据表,而且在feedentry表中增添一个channelID字段,如许就能够随便增加办理Feed频道了。
后果请看:http://www.phpeye.com
本文引见的法式属于PHPEye Blog中英翻译平台的一部分,该平台尚在开辟傍边。
<END>在学习HTML中我想边学边做是最有效的方式,当然这一方式对于学习PHP同样是最有效的。 |
|