<p> 什么?您没听说过 RSS?</p><p> RSS 聚合是最常见的 TLA(三字母缩写词)之一。RSS 作为缩写词具有多种含义,但是当前的标准含义是:真正简单的聚合。这是对这一极为常见、极为有用的标准的最新解释。</p><p> 回想 Internet 早期,一个称为 Pointcast 的软件将数据 推送 到用户计算机上的屏幕保护应用程序上,来提供各种新闻更新。最终,浏览器开发商(例如 Netscape 和 Microsoft)创建了类似这种非常流行的服务的东西。Netscape 开发了接受程度最高的变体,此变体后来被发布到 Internet 开发环境中,并最终发展成了现在的 RSS。</p><p> RSS 将最近更新的信息分发给许多接收者,非常类似广播系统。如果您拥有大量的用户,那么 RSS 提要就像灯塔一样吸引您的用户回来查看更新。因为 RSS 提供了一种急需的维持用户注意力的方法,所以 RSS 越来越流行并为越来越多的内容提供者所使用就没什么好奇怪的了。</p><p> 当您看到图 1 中所示的图标时,您就可以确定此站点提供 RSS 提要。事实上,此图标是表示一个站点针对内容更新提供 RSS 服务的标准图标。图标中的曲线代表无线电波,象征着 RSS 提要的广播本质。</p><p> 图 1. RSS 标准图标</p><p> <img src="/content/uploadfile/200805/2008053117413489.jpg" onclick="get_larger(this)" alt="结合使用PHP和RSS" /></p><p> RSS 应用程序</p><p> 相当多的应用程序(其中许多是免费的)能够阅读 RSS 提要,其中许多允许用户聚合提要。聚合特性甚至允许用户进一步改进所收到内容的数量和性质。每种阅读器都拥有不同的特性,旨在帮助管理来自 Internet 的难以置信的信息量。</p><p> Mozilla 公司的 Thunderbird 和 Firefox、Microsoft 公司的 Internet Explorer 7 和即将推出的 Office 版本以及许多其他产品是最接近您的搜索引擎的一些例子。在这么多种获取和阅读提要的方法中,您应该可以找到适合您的方法。当然,除非您是一位眼光挑剔的软件开发人员,希望编写您自己的程序!本文马上就要对此进行介绍!</p>
<p> </p>
<p> 我如何使用 RSS?</p><p> 您的站点包含您希望公布给大众的内容,这是您将内容发布到 Internet 的首要原因。如果很多用户知道您的站点和内容,他们会每天回来查看更新吗?恐怕不会。在您经常访问的站点中,您会每天访问它们来检查更新吗?恐怕不会。这就是 RSS 产生的原因。</p><p> 对于您的用户来说,RSS 可能是一个巨大的获益,当他们认为您的站点上列出的观点或新闻有价值时尤其如此。用户无需频繁返回您的站点,即可准确了解您进行的更新或添加的内容,从而使用户能够节省时间和精力,同时也不会错过任何更新!</p><p> 如果您整合 RSS 提要来支持您自己站点的内容聚合,那么生成内容不是问题。如果您从提要中拉出数据并将其包括在您的站点中,那么只需很少的时间投资就能为您的站点添加大量的内容。</p><p> 我个人喜欢使用 RSS 来收集来自不同站点(例如 Craigslist (www.craigslist.org))的经过过滤的结果的提要。我使用的一个小技巧是将其用于购买二手电子产品。您可以设置一个站点搜索,然后 RSS 结果页面。如果您设置了一个搜索某个价格范围内的照相机的提要,那么当有人发布在您定的价格范围内的照相机销售信息时,您就会在您的 RSS 提要中看到它!如果您想成为第一个竞价者,这会为您提供巨大的优势!</p><p> RSS 2.0 标准格式</p><p> RSS 标准定义和包含提要的内容。这些提要可能来自任何定义为 Internet 文档的数据源,实际上是由链接清单及其描述构成的。</p><p> 请查看清单 1 中的 RSS 格式,它使用了一个来自 NASA "Liftoff News" 提要的示例文档。</p><p> 清单 1. 一个示例 RSS 2.0 文档</p><code><?xml version="1.0"?><br /><rss version="2.0"><br /> <channel><br /> <title>Liftoff News</title><br /> <link>http://liftoff.msfc.nasa.gov/</link><br /> <description>Liftoff to Space Exploration.</description><br /> <language>en-us</language><br /> <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate><br /> <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate><br /> <docs>http://blogs.law.harvard.edu/tech/rss</docs><br /> <generator>Weblog Editor 2.0</generator><br /> <managingEditor>editor@example.com</managingEditor><br /> <webMaster>webmaster@example.com</webMaster><br /> <item><br /> <title>Star City</title><br /> <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link><br /> <description>How do Americans get ready to work with Russians aboard the<br /> International Space Station? They take a crash course in culture, language<br /> and protocol at Russia's Star City.</description><br /> <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate><br /> <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid><br /> </item><br /> <br /> <item><br /> <title>Space Exploration</title><br /> <link>http://liftoff.msfc.nasa.gov/</link><br /> <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada<br /> will experience a partial eclipse of the Sun on Saturday, May 31st.</description><br /> <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate><br /> <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid><br /> </item><br /> <br /> <item><br /> <title>The Engine That Does More</title><br /> <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link><br /> <description>Before man travels to Mars, NASA hopes to design new engines<br /> that will let us fly through the Solar System more quickly. The proposed<br /> VASIMR engine would do that.</description><br /> <pubDate>Tue, 27 May 2003 08:37:32 GMT</pubDate><br /> <guid>http://liftoff.msfc.nasa.gov/2003/05/27.html#item571</guid><br /> </item><br /> <br /> <item><br /> <title>Astronauts' Dirty Laundry</title><br /> <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link><br /> <description>Compared to earlier spacecraft, the International Space<br /> Station has many luxuries, but laundry facilities are not one of them.<br /> Instead, astronauts have other options.</description><br /> <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate><br /> <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid><br /> </item><br /> </channel><br /></rss></code></p>
<p> </p>
<p> XML 格式的文档的第一个子对象是 <channel>的定义。通道就是提要自身及其相关信息。许多 RSS 提要具有一个通道对象,但是如果您希望使用任意过滤器分离提要,您就可以使用多个通道。通道对象需要 title、link 和 description 对象。它们定义了提要的基本描述信息。可选对象是:language, copyright、managingEditor, webMaster、pubDate, lastBuildDate、category, generator、docs、cloud、ttl、image、rating、textInput、skipHours 和 skipDays。</p><p> 通道能够包含的项目数量不受限制。ITEM 元素的全部元素都是可选的,然而,至少需要一个标题或描述来验证元素。这些元素是:title、link、description、author、category、comments、enclosure、guide、pubDate和source。</p><p> 在什么地方使用 PHP?</p><p> 本文假设您已经具有一些使用 PHP 的经验,并能够使用函数来传递变量并返回结果。PHP 拥有许多能够迅速处理应用程序内外的 XML 的函数。</p><p> 首先您会希望从本地存储的数据源(一个内容管理系统、博客或任何符合 Internet 文档格式的内容)获取信息,并将其作为提要发布给您的用户。您需要获取此数据、将其格式化为 RSS 对象,然后将其提供给需要它的请求。</p><p> 如果您的站点的某些部分需要额外的内容,您无需满世界地为您的站点寻找额外的内容文档,而是可以利用已经准备好的大量 RSS 提要的优势。您可使用 XML_RSS 来为您的站点获取和处理这些提要。</p><p> XML_RSS() 是一个 PEAR 软件包,用于帮助您更轻松地完成更复杂的任务 ―― 解释 XML RSS 文件。PEAR 是 PHP 函数的开源库,它可免费使用并且其开发工作仍在继续。您可能已经在安装 PHP 时安装了 PEAR,但是您可能仍需为本文安装它。XML_RSS() 仅仅是一个函数,它在已知 RSS 提要的位置时,将此提要的 XML 加载到一个阵列,从而为其在您的 PHP 应用程序中的使用做好准备。此阵列的元素将具有根据被读取的 RSS 文件的元素和属性命名的键。</p>
<p> </p>
<p> 把消息传出去</p><p> 您创建了一个供别人阅读的提要,但是如何让别人知道它的存在呢?您可以通过将以下标签添加到主页顶部的方式,通知 Mozilla Firefox 和 Microsoft Internet Explorer 以及其他阅读器关于您的提要的信息:</p><code><link rel="alternate" type="application/rss+xml"<br />href="URL_FOR_YOUR_FEED" title="FEED_TITLE" /></code></p><p> 请确保使用您的 URL 和提要标题更新此标签。</p><p> 提取数据</p><p> 既然您了解了什么是 RSS 数据格式,您就可以查看您希望发布的数据,并将其转换为 RSS 格式。幸好 PHP 拥有一些功能强大的 RSS 和 XML 处理特性,这些特性可加速您的开发。和许多通用的 Web 标准一样,PHP 拥有许多功能强大的函数,可在此应用程序中使用它们。</p><p> 在本文中,您将使用 "" 将数据从数据库中拉出,并将其格式化为 RSS 提要。您将对它进行设置,以便无论何时调用此 RSS 提要,它都能查找您的数据集中新增的内容,并为请求者返回新的 RSS。</p><p> 提要可来自您的站点中的任何数据源,但是最终您需要确保其中包含足够的数据,以便接收 RSS 提要的人能够使用此数据。至少需要 URL 名称和描述。您的站点上发布的任何数据均可被转换为提要。</p><p> 您将使用 PHP 来连接 Web 应用程序数据库、拉出更新的信息,并将其格式化为 XML RSS 文档。</p><p> 提取数据的基本函数</p><p> 假设您选择了一个数据库,您用正常方式创建一个连接,并生成一个页面以适合用户阅读的方式显示 XML 的布局。</p><p> 将此页面发送给请求者</p><p> 既然您已经在您自己的代码中很好地格式化了这些数据,您就需要确保正确地发布这些数据,以便当用户将您的 URL 输入阅读器时,能够获得他们需要的 XML RSS 提要。(请参阅清单 2)。</p>
<p> </p>
<p> 清单 2. 完整的 RSS.php</p><code><?php<br />$database = "nameofthedatabase";<br />$dbconnect = mysql_pconnect(localhost, dbuser, dbpassword);<br />mysql_select_db($database, $dbconnect);<br />$query = "select link, headline, description from `headlines` limit 15";<br />$result = mysql_query($query, $dbconnect);<br />while ($line = mysql_fetch_assoc($result))<br /> {<br /> $return[] = $line;<br /> }<br />$now = date("D, d M Y H:i:s T");<br />$output = "<?xml version="1.0"?><br /> <rss version="2.0"><br /> <channel><br /> <title>Our Demo RSS</title><br /> <link>http://www.tracypeterson.com/RSS/RSS.php</link><br /> <description>A Test RSS</description><br /> <language>en-us</language><br /> <pubDate>$now</pubDate><br /> <lastBuildDate>$now</lastBuildDate><br /> <docs>http://someurl.com</docs><br /> <managingEditor>you@youremail.com</managingEditor><br /> <webMaster>you@youremail.com</webMaster><br /> ";<br /> <br />foreach ($return as $line)<br />{<br /> $output .= "<item><title>".htmlentities($line['headline'])."</title><br /> <link>".htmlentities($line['link'])."</link><br /> <br /><description>".htmlentities(strip_tags($line['description']))."</description><br /> </item>";<br />}<br />$output .= "</channel></rss>";<br />echo $output;<br />?></code></p>
<p> </p>
<p> 因此,让我们逐步实现此目的。首先,您设置一个到本地数据库的数据库连接对象。在此数据库中有一个具有包含标题、链接和描述字段的记录的表,您将请求把这些内容放入您的 XML 响应中。您使用 MYSQL_QUERY() 对您的表执行 SQL 查询,然后您使用 WHILE 重新格式化结果来预排将得到的对象,并将数据重新格式化为新的简单阵列。</p><p> 当新的阵列准备好之后,您就可以开始使用 $output 变量构建 XML 文件,通过为每个返回的响应遍历一次 $line 阵列的方式附加新的元素。这不应该占用太多的时间,因为在您的 SQL 语句中,您将响应限制设为 15。为了将此代码片段用作起始构建块,您需要替换虚拟链接、数据库名称和登录信息来反映您自己的环境。</p><p> 此脚本被执行之后,您会得到一个非常干净的 RSS 文件输出,类似于清单 3。</p><p> 清单 3. RSS.php 输出</p><code><?xml version="1.0"?><br /> <rss version="0.97"><br /> <channel><br /> <title>Our Demo RSS</title><br /> <link>http://www.tracypeterson.com/RSS/RSS.php</link><br /> <description>A Test RSS</description><br /> <language>en-us</language><br /> <pubDate>Mon, 13 Nov 2006 22:46:06 PST</pubDate><br /> <lastBuildDate>Mon, 13 Nov 2006 22:46:06 PST</lastBuildDate><br /> <docs>http://someurl.com</docs><br /> <managingEditor>you@youremail.com</managingEditor><br /> <webMaster>you@youremail.com</webMaster><br /> <item rdf:about="http://www.tracypeterson.com/"><br /> <title>This is Tracy's Web Page!</title><br /> <link>http://www.tracypeterson.com/</link><br /> <description>This is a demonstration of how to get PHP to work for<br />your RSS feed.</description><br /> </item><item rdf:about="http://www.tracypeterson.com"><br /> <title>This is Tracy's site again!</title><br /> <link>http://www.tracypeterson.com</link><br /> <description>Again, this is a demonstration of the power of PHP<br />coupled with RSS.</description><br /> </item></channel></rss></code></p>
<p> </p>
<p> 现在任何人都可以通过输入到 RSS.php 的 URL,加载包含您的全部更新的新 RSS 文件了!</p><p> 导入数据</p><p> 您将使用 XML_RSS() 函数将 RSS 提要导入到 PHP 脚本中,以便使其像任何阵列一样准备就绪。就像对数据库的查询一样,您将拥有一个准备好在需要时即可使用的阵列。</p><p> 在本案例中,您将连接到 RSS.php 并加载一个副本,然后在无序清单中显示它(请参阅清单 4)。</p><p> 清单 4. showfeed.php</p><code><?php<br />require_once "XML/RSS.php";<br />$rss =& new XML_RSS("http://www.tracypeterson.com/RSS/RSS.php");<br />$rss->parse();<br />echo "<h1>Headlines from <a<br />href="http://www.tracypeterson.com/RSS/RSS.php">Tracy<br /> Peterson's Site</a></h1><br />"; echo "<ul><br />";<br />foreach ($rss->getItems() as $item) {<br /> echo "<li><a href="" . $item['link'] . "">" . $item['title'] .<br />"</a></li><br />";<br />}<br />echo "</ul><br />";<br />?></code></p><p> 清单 4 中显示的示例直接来自 PEAR 手册,我使用它是因为它非常简练。让我们逐行查看它来看看它是否仅使用了 XML_RSS() 类、构造器和 parse()提供的几个方法。解析操作仅将输出作为我之前提到的阵列呈现。</p><p> 首先,您使用 require_once() 函数来从 PEAR 安装中加载 RSS.php 文件。如果正确设置了 PEAR 并安装了 XML_RSS ,那么它将正确地找到此引用文件,然后 XML_RSS 对象就准备好供您使用了。接下来,您创建一个名为 $rss 的新对象,此对象是将提要的 URL 传递到您的 XML_RSS 构造器的结果。</p>
<p> </p>
<p> 您仅使用 parse() 方法来返回 RSS 提要中的值。第一个 echo 行开始设置用于使 RSS 提要能够被用户阅读的基本 HTML。在本案例中,您声明此无序清单是来自我的站点的标题的清单!</p><p> foreach() 语句通过将 getItems() 方法用作新的阵列 $items,从解析的提要中获取每个项目元素。每个阵列元素根据包含它们的实际 XML 标签命名。在本案例中,您仅使用了链接和标题,一会您将添加对它们的描述。每处理一次 foreach 循环,就会移动到下一个元素,直到整个 RSS 提要以此方式全部显示出来。</p><p> 现在,将描述添加到每个显示的结果中。</p><p> 将清单 5 中显示的粗体代码行添加到 foreach() 循环中。</p><p> 清单 5. 添加描述</p><code>foreach ($rss->getItems() as $item) {<br /> echo "<li><a href="" . $item['link'] . "">" . $item['title'] .<br />"</a></li><br>";<br /> echo $item['description'] . "<br><br><br />"; }</code></p><p> 您只需向无序清单中添加一个换行符和描述行。以下是 showfeed.php 输出的一个示例。</p><p> 图 2. showfeed.php 输出</p><p> <img src="/content/uploadfile/200805/2008053117413704.jpg" onclick="get_larger(this)" alt="结合使用PHP和RSS" /></p><p> 结束语</p><p> 总的说来,Internet 才刚刚开始意识到它拥有的难以置信的潜力。通过 RSS 提供的提高了的可访问性,您现在能够简化使您的用户保持同步的过程。您能够及时将更新通知到用户,而无需用户花费时间来检查您是否添加了新信息。</p><p> 您刚刚探索了 RSS 格式的标准,以及如何创建提要、接收提要并将其转换为可用的 HTML。现在您已经准备好在更大型的应用程序中使用这些技能了。</p>