詳解PHP和AJAX創(chuàng)建的RSS聚合器(2)_PHP教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:解讀Windows環(huán)境PHP的session為何不能正常使用首先打開PHP的配置文件 php.ini ,找到 session.save_path = /tmp 這一行,這是PHP在linux下的配置,Windows下PHP無法讀寫session文件導(dǎo)致session無法使用,把它改成一個絕對路徑就可以了,例如: session.save_path = C:\windows\temp 。
這個類中唯一的方法是一個請求方法,它僅有一個指向所請求的RSS 饋送的URL的參數(shù)。然后,它通過rss的名字來檢查是否一目錄位于本地服務(wù)器上。如果不存在,就創(chuàng)建一個并把其權(quán)限模式設(shè)置為0666,這意味著該目錄可讀寫。當(dāng)被設(shè)置為可讀的時,該目錄就可以在以后被存取;而當(dāng)被設(shè)置為可寫的時,就可以把該饋送的一個副本寫向本地服務(wù)器上的目錄:
| //如果不存在目錄就創(chuàng)建一個 $dir = "rss"; if(!is_dir($dir)) { mkdir($dir, 0666); } |
注意
在一臺Windows機器上,對于PHP 4.2.0及以上版本中模式設(shè)置是不被要求的。但是,如果它存在的話,它將被忽略;因此,我保留了它,以備該工程被遷移到一臺UNIX或Linux服務(wù)器上。
在把饋送復(fù)制到該服務(wù)器前,我們需要一個唯一的文件名。我對這個完整的URL使用了md5加密方法以確保所有饋送的名字是唯一的。通過這個新的文件名,它可以連接一個描述指向該文件的目錄的字符串;這將在創(chuàng)建該饋送的副本時使用:
| //創(chuàng)建唯一的命名 $file=md5($rss_url); $path="$dir/$file.xml"; |
通過使用被定義在上面的路徑和到原始的被請求的饋送的URL的參考,現(xiàn)在我們能創(chuàng)建該文件的一個副本。最后,把該路徑返回到該新文件,作為對該請求的響應(yīng):
| //復(fù)制饋送到本地服務(wù)器 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 != "") { //如果不存在目錄就創(chuàng)建一個 $dir = "rss"; if(!is_dir($dir)) { mkdir($dir, 0666); } // 創(chuàng)建一個唯一的名字 $file = md5($rss_url); $path = "$dir/$file.xml"; //復(fù)制饋送到本地服務(wù)器 copy($rss_url, "$path"); return $path; } } } ?> |
為了存取該PHP類中的方法,需要有一個請求文件來擔(dān)當(dāng)?shù)皆擃惖囊粋接口,這也正是我們正在請求的文件。這個文件首先驗證從該請求查詢的一口令變量,或者返回一條指定該請求者不是一名經(jīng)授權(quán)的用戶的消息,或者用指向RSS饋送(該饋送在由請求方法處理后被復(fù)制到本地服務(wù)器)的路徑作出響應(yīng)。為了響應(yīng)該 RSS饋送,需要包含這個RSS對象并把它實例化,并且需要通過使用被請求的饋送的URL作為一參數(shù)來激活請求方法:
| <? 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相結(jié)合
為了POST請求,我們首先需要創(chuàng)建該請求對象。如果你沒有創(chuàng)建請求對象的經(jīng)驗,那么可以讀一下我的文章《How To Use AJAX》或簡單地研究一下本文的示例源代碼。一旦創(chuàng)建該請求對象,就可以調(diào)用sendFeed方法并傳遞由表單所創(chuàng)建的URL:
| function sendFeed(url){ post.onreadystatechange = sendRequest; post.open("POST", url, true); post.send(url); } |
一旦收到來自于PHP對象的響應(yīng)并被正確加載,則對與該響應(yīng)相應(yīng)的本地文件發(fā)出另一個請求。在這種情況中,post.responseText提供給我們該新文件的路徑:
| function sendRequest(){ if(checkReadyState(post)){ request = createRequestObject(); request.onreadystatechange = onResponse; request.open("GET", post.responseText, true); request.send(null); } } |
分析響應(yīng)
由于RSS饋送之間的區(qū)別,分析響應(yīng)具有一定的挑戰(zhàn)性。一些含有包含標(biāo)題和描述結(jié)點的圖像,而其它則沒有。因此,當(dāng)我們分析回饋時,我們需要做一點檢查來譯解它是否包括一圖像。如果它包括一圖像,我們就可以,與該饋送的標(biāo)題和鏈接一起,在image div標(biāo)簽中顯示該圖像:
| 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; |
我們不僅必須檢查每個圖像以顯示它,當(dāng)遍歷饋送中所有的項時我們還需要對之進行檢查。因為如果存在一個圖像,那么所有另外的標(biāo)題和鏈接結(jié)點索引都將無法正常工作。因此,當(dāng)發(fā)現(xiàn)圖像標(biāo)簽時,我們應(yīng)該通過在每一次遍歷中增加索引值(+1)來調(diào)整標(biāo)題和鏈接結(jié)點的索引:
| 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')[i].firstChild.data; var _link = response.getElementsByTagName('link')[i].firstChild.data; } |
你可以使用checkForTag方法來檢查是否存在特定的標(biāo)簽:
| function checkForTag(tag){ if(tag != undefined) { return true; } else{ return false; } } |
存在許多種進行饋送分析的可能性。例如,你可以把項賦到類別上并使得該類別可折迭,這樣用戶就可以對其想觀看的內(nèi)容進行選擇。作為一個示例,我使用日期來對項進行分類-這可以通過譯解是否針對一個特定項的pubDate不同于前一個項的pubDate并且相應(yīng)地顯示一新的日期來實現(xiàn):
| 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=\"" + i + "');\">" + _title + "</a><br/><br/>"; document.getElementById('copy').innerHTML += _copy; |
注意,上面的最后一部分是showDetails方法,它用于當(dāng)一用戶從一個饋送中選擇一特定的項時進行細節(jié)顯示。這個方法有一個參數(shù)(項索引值),這個索引用于發(fā)現(xiàn)在該饋送中details結(jié)點的索引:
| function showDetails(index){ document.getElementById('details').innerHTML = response.getElementsByTagName('description')[index].firstChild.data; } |
結(jié)論
使用AJAX發(fā)送查詢字符串到一個服務(wù)器端腳本并檢索一個基于該串的定制響應(yīng),這對于任何web開發(fā)者都有實現(xiàn)的可能。這樣以來,你的下一個web應(yīng)用程序也將會充滿了新的可能性。
分享:淺談保護代碼安全,PHP如何進行注入今天寫代碼的時候猛然想到是不能能夠通過一個文件來處理整個網(wǎng)站中所有可能出現(xiàn)注入的地方進行防范呢?這樣就能夠不用在每個程序里對每個變量進行過濾,節(jié)省了時間和代碼。 我們主要是從兩點出發(fā),因為我們的獲取的變量一般都是通過GET或者POST方式提交過來
相關(guān)PHP教程:
- 相關(guān)鏈接:
- 教程說明:
PHP教程-詳解PHP和AJAX創(chuàng)建的RSS聚合器(2)
。