仓酷云

标题: PHP教程之基于PHP和AJAX创立RSS聚合器 [打印本页]

作者: 变相怪杰    时间: 2015-2-16 00:30
标题: PHP教程之基于PHP和AJAX创立RSS聚合器
PHP的理解是新手最难迈过的一道门槛,不过你应该感到幸运的是PHP已经最大极限的为了新手而努力了,如果你学过其他的语言,也许会觉得PHP的确相当的简单,但是如果你之前什么都没学过,那么阿弥陀佛,硬着头皮琢磨吧。ajax|rss|创立     想象利用一个复杂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;
  }
 }
}
?>
  为了存取该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;
}
  结论

  利用AJAX发送查询字符串到一个办事器端剧本并检索一个基于该串的定制呼应,这关于任何web开辟者都有完成的能够。如许以来,你的下一个web使用法式也将会充斥了新的能够性。  可以在书上很方便地做标记,及时记下自己的心得体会。
作者: 只想知道    时间: 2015-2-16 05:16
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 飘飘悠悠    时间: 2015-2-22 18:14
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
作者: 分手快乐    时间: 2015-3-2 18:22
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 老尸    时间: 2015-3-11 04:30
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 再见西城    时间: 2015-3-11 11:23
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 冷月葬花魂    时间: 2015-3-18 07:56
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 兰色精灵    时间: 2015-3-18 12:26
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 乐观    时间: 2015-3-25 20:40
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 小女巫    时间: 2015-4-1 21:55
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: admin    时间: 2015-4-2 23:45
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
作者: 小妖女    时间: 2015-4-5 11:10
本文当是我的笔记啦,遇到的问题随时填充
作者: 深爱那片海    时间: 2015-4-6 23:08
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 第二个灵魂    时间: 2015-4-7 17:12
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 变相怪杰    时间: 2015-4-16 09:27
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 活着的死人    时间: 2015-4-19 00:38
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 若天明    时间: 2015-4-25 13:01
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 飘灵儿    时间: 2015-4-26 09:12
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 海妖    时间: 2015-4-28 09:55
兴趣是最好的老师,百度是最好的词典。
作者: 蒙在股里    时间: 2015-5-2 02:17
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2