仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1028|回复: 18
打印 上一主题 下一主题

[学习教程] PHP教程之利用Zend_Feed+Cron打造Feed Reader

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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同样是最有效的。
老尸 该用户已被删除
沙发
发表于 2015-2-4 09:57:12 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
小魔女 该用户已被删除
板凳
发表于 2015-2-8 08:24:34 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
活着的死人 该用户已被删除
地板
发表于 2015-2-11 08:20:08 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
飘飘悠悠 该用户已被删除
5#
发表于 2015-3-2 01:17:10 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
只想知道 该用户已被删除
6#
发表于 2015-3-2 04:15:20 | 只看该作者
爱上php,他也会爱上你。
莫相离 该用户已被删除
7#
发表于 2015-3-4 16:44:41 | 只看该作者
做为1门年轻的语言,php一直很努力。
简单生活 该用户已被删除
8#
发表于 2015-3-5 15:23:35 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
乐观 该用户已被删除
9#
发表于 2015-3-12 08:52:01 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
若天明 该用户已被删除
10#
发表于 2015-3-19 19:17:04 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
透明 该用户已被删除
11#
发表于 2015-3-23 21:05:54 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
金色的骷髅 该用户已被删除
12#
发表于 2015-4-4 19:35:05 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
精灵巫婆 该用户已被删除
13#
发表于 2015-4-16 14:09:29 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
兰色精灵 该用户已被删除
14#
 楼主| 发表于 2015-4-17 11:01:21 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
不帅 该用户已被删除
15#
发表于 2015-5-2 15:20:29 | 只看该作者
当然这种网站的会员费就几十块钱。
灵魂腐蚀 该用户已被删除
16#
发表于 2015-5-8 20:56:22 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
爱飞 该用户已被删除
17#
发表于 2015-6-15 15:10:50 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
飘灵儿 该用户已被删除
18#
发表于 2015-6-22 15:45:31 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
蒙在股里 该用户已被删除
19#
发表于 2015-6-29 05:07:08 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 03:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表