用PHP和AJAX创建RSS聚合器(1)


尽管本文所使用的是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 onload="javascript:makeRequest('request.php?request=' + document.feedForm.feed.value + '"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;

}

 }

}

?>
 


为了存取该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.r

本文作者:



相关阅读:
基于Snoopy的PHP近似完美获取网站编码的代码
PHP 网页过期时间的控制代码
CSS教程:总结清除浮动的方法
Unix/Linux下通过远程桌面连接Windows OS
判“新”函数:得到今天与明天的秒数
php中变量及部分适用方法
Linux系统下管道被接受方关闭的问题
推荐ASP超速入门视频教程
实现数据库事务的方法ExecuteSqlTran()
DISCUZ 论坛管理员密码忘记的解决方法
找到MySQL的优点
SQL 2005中的SSIS与Oracle数据库的迁移性能
Oracle清理和重建临时表空间
掌握盒模型轻松DIV CSS网页布局
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 大象救小兔作文100字 专题民主生活会发言提纲(副县长) 一世得体 上网的好与坏作文650字 与虎有关的成语 心里只有妳 关于雪景的作文:迷人的雪景 感谢一杯酒作文700字 中国出口产业的调整方向 【精品】红领巾广播站广播稿 写事作文写法详解—写学校的事作文类型 蚕姑坨采风记 微凉夕颜旧 消失在夜中的紫星(四)作文500字 黄山奇观作文450字 为自己开脱 《谋杀鉴赏》(最新修订版)图书描述 麻雀儿与原子弹 病客吟 我就是我 不一样的烟火 个性语录 学校本部文明单位创建活动汇报材料 小草的呐喊作文750字 QQ上常用的三八妇女节搞笑祝福 尺有所短,寸有所长作文300字 我哭泣、谁心疼? 什么人才是真正的朋友呢? 捍卫作文100字 关于金弹子打鸟的歇后语 暗恋个性签名大全:斑驳幸福的回忆,眼泪成为最后的馈赠 tiamo罗 此昵称已不存在 感恩节祝福老师的话语 养鸡 指缝阳光作文1600字 人生能有几回搏 晨爬豹山 2015年3月大学生预备党员转正申请书 一点就懂的道理 致联合国秘书长潘基文先生的一封信作文2100字 爱,能保持去吗? 最新励志电影推荐:破风 新闻发布会发言人发言稿 笑看人生两百年 第二单元作文:绿色家乡 我喜欢的体育老师 校园反邪教工作总结 关爱流浪猫狗 T 农业的发展 教案示例2 小学四年级作文350字:墨西哥火龙果 你的寂静,我的荒凉 笑着忘记你忘记的

Copyright © 2016 phpStudy |