基于PHP和AJAX创建RSS聚合器 移动IP与DHCP、VPN等技术的比较 五招让Vista电脑更具个性化 Oracle 如何搞垮他的数据库——谈Oracle安全

基于PHP和AJAX创建RSS聚合器

[ 4741 查看 / 4 回复 ]

想象使用一个简单HTML文件来把一个请求发送到一个服务器端脚本,收到一个基于该请求的定制XML文件,然后把它显示给用户而几乎不需要刷新浏览器!本文作者将同你一起探讨怎样在普通Web应用程序中联合PHP和AJAX技术来创建实时的数据传输而不需要进行浏览器刷新。

  尽管本文所使用的是PHP语言,但是请记住任何服务器端语言都会正常工作。为了理解本文,我假定你基本理解JavaScript和PHP或一类似服务器端语言。

  本文示例使用AJAX来把一请求从一个RSS馈送发送到一定制的PHP对象。该PHP对象复制一份在本地服务器上的该馈送并返回这一路径。该请求对象收到这一路径,分析它,并且把数据以HTML形式显示给用户。这听起来涉及很多步骤,其实它仅由4个小文件组成。之所以使用了4个小文件,是为了平衡它们各自特定的力量而使整个系统的处理极富效率性。

  有些读者可能会问,为什么你要创建在本地服务器上的馈送的一个副本而不是简单分析最原始的馈送。原因是,这样以来可以允许绕过XML HTTP Request对象所强加的跨域限制。后面,我还会解释怎样创建这个定制的PHP对象;但是首先,让我们从表单创建开始。

  创建发出请求的表单

  你要做的第一事情是,在你的HTML的head标签之间包括你可能想使用的JavaScript和任何CSS文件。我包括了一个式样表来实现该聚合器的最后布局并用一个JavaScript文件来发出请求和进行馈送分析:

<link href="css/layout.css" rel="stylesheet" type="text/css" />
<script src="js/request.js"></script>

  下一步,创建一个表单,它针对你所选择的一个RSS馈送发出请求。我创建的表单只包括一个输入字段和一个提交该请求的按钮。该请求的查询是一个字符串,它由馈送输入值和一个将在服务器端被校验的口令字组成;作为一个示例,我使用了下面形式:
"password=mypassword

  该代码在每次页面加载之时发出一次请求;因此,如果页面被刷新,现有的在该输入域中的馈送串将在页面加载时被请求。下面是一个表单数据的示例,连同一些div标签用来显示已分析的馈送的特定结点:

<body password=mypassword');">
<form name="feedForm" method="post" action="javascript:makeRequest('request.php?request=' document.feedForm.feed.value '"password=mypassword');">
Enter a feed: <input type="text" name="feed" id="feed" size="20">
  <input type="submit" name="submit" value="Add Feed">
</form>
<div id="logo"></div>
<hr/>
<div id="copy"></div>
<div id="details"></div>
</body>

  我所创建的这三个div标签是logo,copy和details,其中每一个都在布局样式表中有一个与之相关联的样式。当我们分析馈送时将会用到它们,但是我们首先需要能够存取我们所请求的馈送。这可以使用我前面所提到的PHP对象来完成。

  创建定制的PHP对象

  我用PHP创建了一个小型RSS类,它在本地服务器上创建一个请求馈送的副本,这样它可以为我们稍后要创建的XML HTTP Request对象所存取。典型地,你不能跨域请求一个文件,这意味着你要请求的文件需要位于本地服务器上。这个类是一种解决跨域问题的办法,因为它创建该馈送的一个副本,这个副本在本地服务器上被请求并且把本地路径返回到该馈送,然后它由该Request对象来存取。

  这个类中唯一的方法是一个请求方法,它仅有一个指向所请求的RSS 馈送的URL的参数。然后,它通过rss的名字来检查是否一目录位于本地服务器上。如果不存在,就创建一个并把其权限模式设置为0666,这意味着该目录可读写。当被设置为可读的时,该目录就可以在以后被存取;而当被设置为可写的时,就可以把该馈送的一个副本写向本地服务器上的目录:

//如果不存在目录就创建一个
$dir = "rss";
if(!is_dir($dir))
{
  mkdir($dir, 0666);
}

  注意

  在一台Windows机器上,对于PHP 4.2.0及以上版本中模式设置是不被要求的。但是,如果它存在的话,它将被忽略;因此,我保留了它,以备该工程被迁移到一台UNIX或Linux服务器上。

  在把馈送复制到该服务器前,我们需要一个唯一的文件名。我对这个完整的URL使用了md5加密方法以确保所有馈送的名字是唯一的。通过这个新的文件名,它可以连接一个描述指向该文件的目录的字符串;这将在创建该馈送的副本时使用:

//创建唯一的命名
$file=md5($rss_url);
$path="$dir/$file.xml";

  通过使用被定义在上面的路径和到原始的被请求的馈送的URL的参考,现在我们能创建该文件的一个副本。最后,把该路径返回到该新文件,作为对该请求的响应:

//复制馈送到本地服务器
copy($rss_url,"$path");
return $path;
Following is the small, yet powerful RSS class in its entirety:
<?php
class RSS
{
  function get($rss_url)
  {
  if($rss_url != "")
  {
  //如果不存在目录就创建一个
  $dir = "rss";
  if(!is_dir($dir))
  {
  mkdir($dir, 0666);
  }
  // 创建一个唯一的名字
  $file = md5($rss_url);
  $path = "$dir/$file.xml";
  //复制馈送到本地服务器
  copy($rss_url, "$path");
  return $path;
  }
  }
}
?>[/td][/tr][/table]
  为了存取该PHP类中的方法,需要有一个请求文件来担当到该类的一个接口,这也正是我们正在请求的文件。这个文件首先验证从该请求查询的一口令变量,或者返回一条指定该请求者不是一名经授权的用户的消息,或者用指向RSS馈送(该馈送在由请求方法处理后被复制到本地服务器)的路径作出响应。为了响应该RSS馈送,需要包含这个RSS对象并把它实例化,并且需要通过使用被请求的馈送的URL作为一参数来激活请求方法:

<?
if($password == "mypassword")
{
  require_once('classes/RSS.class.php');
  $rss = new RSS();
  echo $rss->get($request);
}
else
{
  echo "You are an unauthorized user";
}
?>

  GET/POST与AJAX相结合

  为了POST请求,我们首先需要创建该请求对象。如果你没有创建请求对象的经验,那么可以读一下我的文章《How To Use AJAX》或简单地研究一下本文的示例源代码。一旦创建该请求对象,就可以调用sendFeed方法并传递由表单所创建的URL:

function sendFeed(url){
  post.onreadystatechange = sendRequest;
  post.open("POST", url, true);
  post.send(url);
}

  一旦收到来自于PHP对象的响应并被正确加载,则对与该响应相应的本地文件发出另一个请求。在这种情况中,post.responseText提供给我们该新文件的路径:

function sendRequest(){
  if(checkReadyState(post)){
  request = createRequestObject();
  request.onreadystatechange = onResponse;
  request.open("GET", post.responseText, true);
  request.send(null);
  }
}

  分析响应

  由于RSS馈送之间的区别,分析响应具有一定的挑战性。一些含有包含标题和描述结点的图像,而其它则没有。因此,当我们分析回馈时,我们需要做一点检查来译解它是否包括一图像。如果它包括一图像,我们就可以,与该馈送的标题和链接一起,在image div标签中显示该图像:

var _logo = "";
var _title = response.getElementsByTagName('title')[0].firstChild.data;
var _link = response.getElementsByTagName('link')[0].firstChild.data;;
_logo = "<a href='" _link "' target='_blank'>" _title "</a><br/>";
if(checkForTag(response.getElementsByTagName('image')[0]))
{
  var _url = response.getElementsByTagName('url')[0].firstChild.data;
  _logo = "<img src='" _url "' border='0'><br/>"
}
document.getElementById('logo').innerHTML = _logo;

  我们不仅必须检查每个图像以显示它,当遍历馈送中所有的项时我们还需要对之进行检查。因为如果存在一个图像,那么所有另外的标题和链接结点索引都将无法正常工作。因此,当发现图像标签时,我们应该通过在每一次遍历中增加索引值( 1)来调整标题和链接结点的索引:

if(checkForTag(response.getElementsByTagName('image')[0]) "" i>0){
  var _title=response.getElementsByTagName('title')[i 1].firstChild.data;
  var _link=response.getElementsByTagName('link')[i 1].firstChild.data;
}
else{
  var _title =response.getElementsByTagName('title').firstChild.data;
  var _link = response.getElementsByTagName('link').firstChild.data;
}

  你可以使用checkForTag方法来检查是否存在特定的标签:

function checkForTag(tag){
  if(tag != undefined) {
  return true;
  }
  else{
  return false;
  }
}

  存在许多种进行馈送分析的可能性。例如,你可以把项赋到类别上并使得该类别可折迭,这样用户就可以对其想观看的内容进行选择。作为一个示例,我使用日期来对项进行分类-这可以通过译解是否针对一个特定项的pubDate不同于前一个项的pubDate并且相应地显示一新的日期来实现:

if(i>1){
  var previousPubDate = response.getElementsByTagName('pubDate')[i-1].firstChild.data;
}
if(pubDate != previousPubDate || previousPubDate == undefined){
  _copy = "<div id='detail'>" pubDate "</div><hr align='left' width='90%'/>";
}
_copy = "<a href=\"javascript:showDetails('" i "');\">" _title "</a><br/><br/>";
document.getElementById('copy').innerHTML = _copy;

  注意,上面的最后一部分是showDetails方法,它用于当一用户从一个馈送中选择一特定的项时进行细节显示。这个方法有一个参数(项索引值),这个索引用于发现在该馈送中details结点的索引:

function showDetails(index){
  document.getElementById('details').innerHTML = response.getElementsByTagName('description')[index].firstChild.data;
}
TOP

顶下了 呵呵
TOP

  你经常吃苹果,那么你知道苹果都有什么营养价值吗?今天,营养中国的营养师就告诉你苹果的营养价值,你可要细细地看噢!
  苹果酸甜可口,营养丰富,是老幼皆宜的水果之一。它人营养价值与医疗价值都很高。每100克鲜苹果果肉中含糖类15克,蛋白质0.2克,脂肪0.1克,粗纤维0.1克,钾110毫克,钙0.11毫克,磷11毫克,铁0.3毫克,胡萝卜素0.08毫克,维生素B1为0.01毫克,维生素B2为0.01毫克,尼克酸0.1毫克,还附有锌及山梨醇、香橙素、维生素C等营养物质。
  一、苹果中附有神奇的“苹果酚”,极易在水中溶解,易被人体所汲取。这种神奇的“苹果酚”起到七种功效“一是抗氧化效果,可保持食物新鲜;二是清除异味,可去鱼腥、口臭;三是防止蛀牙;四是能抑制黑色素、酵素的产生;五是能抑制活性氧导致的多种生活习惯病;六是能抑制血压上升,防止高血压;七是能抑制过敏反应,有一定的抗敏效果。
  二、苹果中附有“果胶”,这是一种水溶性食物纤维,能够降低肠内的不良细菌数量,帮助有宜细菌生殖。
  三、苹果中附有丰富的维他命C。维生素C是心血管的保护神、心脏病患者的健康元素。同时维他命C能够有效抑制皮质黑色素的构成,帮助清除肌肤色斑,增加血红素,延缓肌肤衰老,起到美容养颜的功效。
  四、苹果中多糖、钾离子、果胶、酒石酸等物质。现代人在平常饮食中摄入蛋白质过多,这些蛋白质分解成氨基酸,从而导致大多数人的体液都呈“酸性”。容易使人感到疲劳乏力。苹果中所含的多糖、钾离子、果胶、酒石酸等,能够中及其本性体液中的酸根,减少体液中的本性,从而缓解疲劳。
  五、苹果中附有黄酮类化合物。黄酮类化合物是减少癌症发病率的有效物质。
  相信你现在对苹果有什么营养价值有一定地了解了,赶快吃一个苹果,补充下身体的营养吧!
原文来源:http://www.yingyang99.com/html/yin_shi/shuiguo/20101021/72717.html 来源:营养中国 http://www.yingyang99.com
TOP

我是一个漂在北京的“月负族”,月月工资不够花销,悲惨的生活在北京这个大都市中,为了自己的梦想背负着沉重的心理负担。这样的生活背景下有多少与我背景唏嘘的同龄人在为那虚无缥缈的梦在奋斗?以下是我的账单:
    生活城市:北京
  职位:长松咨询网编辑
  工资:1500元
  花销如下:
  房费:750每月(一交3个月的,郁闷,还得压两个月)
  电费:100每月(用电比较猛,每月肯定超87度)
  水费:25每月(不太固定,不过基本上是这样)
  饭钱:20每天(自己做饭,每天买菜)
  交通费:60每月(每天上班要倒趟车)
  电话费:50每月(基本上是这样,如果有特殊情况那就多了去了)
  其他花费:
  燃气费(这个不太清楚一个月能用多少,差不多10元吧,上次去交的时候是挺麻烦的,2.05一个字,只能去北京银行交,郁闷中)
  药费:
  感冒药常备(120元,就一点)
  某口服液:49元,治便秘的,现在已好
  上面是这个月的主要花销,其余的想不起来了,这就是我一个人这月的花费。。。不包括女朋友的话花费
  花费:1764元 收入:1500
  偶滴神呐~你们说我不啃老还能怎么办???
  唉。。。还得结婚生孩子。。。这钱只能靠老爸老妈了。。。那些说我们啃老的人真是站着说话不腰疼,现在的大学生就这样啊。。。
  身体的便秘好了。。。生活又堵了。。。
TOP

澳洲MPS乳业公司荣誉出品 原厂地出产,原装进口。

澳大利亚MPSMilk Powder Solutions Pty Ltd)乳业是全球最专业最知名的乳制品研发制造商之一。遵循并执行以HACCP为基础的食品安全项目和世界上最为严格的食品安全检测程序,始终把食品的安全放在最为关注的位置。同时,十年母乳化营养研究的精华铸就了澳素(Ausupp)婴幼儿奶粉至尊品质,多重营养配方将母乳的关爱延续至极致,更让您的宝宝赢在起跑线上:

独特添加运用的LCP(长链多不饱和脂肪酸),是人体必需的脂肪酸(EFA)亚油酸和α-亚麻酸的重要衍生物,全面促进宝宝的神经系统和智商发育。随着EFA营养作用得到公认,LCP在婴幼儿成长发育过程中的重要作用已日益受到人们的重视。澳素(Ausupp)奶粉严格选用单细胞源性长链多不饱和脂肪酸(微藻油)为LCP原料,微藻油是一种单细胞油脂,它的生产全过程均在封闭系统中进行,因此,相对于其它油脂更加安全可靠。

原装进口,金牌品质的保证!绝非国内罐装产品所能媲美!即将闪亮登场!敬请关注专业权威育儿杂志《妈咪宝贝》《科学育儿》2010全年广告。

产品系列:
澳素(Ausupp)金装婴儿奶粉(012个月)        900/
澳素(Ausupp)金装较大婴儿奶粉(6个月—18个月900/
澳素(Ausupp)金装幼儿奶粉(13岁及以上)    900/

中国地区总经销:上海澳欧生物科技有限公司 营养热线:400-820-5937

TOP