首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

打造高效 RSS 聚合器:PHP 與 AJAX 實戰教學(上)

     編輯:PHP 相關知識

專案目標與架構概覽

本教學將引導你構建一個基於 PHP 後端與 AJAX 前端的 RSS 聚合器。核心挑戰在於瀏覽器同源策略禁止跨域請求 XML,解決方案是建立一個 PHP 代理類別,將遠端 RSS 下載至本地暫存,再由前端 AJAX 讀取本地副本,實現跨域聚合。

前端:發起請求的表單

在 HTML <head> 引入樣式與腳本:

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

表單僅包含一個輸入框與提交按鈕,頁面載入時自動發送一次請求:

<body onload="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、版權資訊與條目明細,樣式定義於 layout.css。

後端:自定義 PHP RSS 代理類別

classes/RSS.class.php 核心邏輯:

<?php
class RSS {
  function get($rss_url) {
    if ($rss_url != "") {
      // 1. 確保快取目錄存在
      $dir = "rss";
      if (!is_dir($dir)) { mkdir($dir, 0666); } // Windows 下模式參數會被忽略,保留以利移植

      // 2. 以 URL 的 MD5 為檔名,保證唯一
      $file = md5($rss_url);
      $path = "$dir/$file.xml";

      // 3. 複製遠端 RSS 至本地
      copy($rss_url, $path);
      return $path; // 回傳本地路徑供前端讀取
    }
  }
}
?>

介面腳本:request.php

驗證密碼後實例化 RSS 類別並輸出本地路徑:

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

前端 JavaScript:request.js 關鍵邏輯

  1. makeRequest(url) 建立 XMLHttpRequest 物件,支援 IE6 ActiveX 回退。
  2. 送出 GET 請求至 request.php,攜帶 request(RSS URL)與 password 參數。
  3. 回調函數解析回傳的本地 XML 路徑,再發起第二次 AJAX 請求讀取該 XML。
  4. 使用 DOMParser 或 responseXML 解析 RSS,提取 <title>、<link>、<description> 等節點,動態填入 logo、copy、details 三個容器。

跨域限制的根本繞過原理

瀏覽器阻擋 XMLHttpRequest 直接存取不同網域資源。本方案讓 PHP 在同網域下充當「中繼站」:

  1. 前端請求 PHP 代理(同網域,允許)。
  2. PHP 以伺服器身份抓取遠端 RSS(伺服器端無同源限制)。
  3. PHP 將內容存為本地檔案,回傳本地路徑。
  4. 前端再次請求本地檔案(同網域,允許),完成解析顯示。

效能與安全優化提示

  • 快取目錄設定 0666 權限,並定期清理過期檔案(如 cron 每日刪除 24 小時前的 .xml)。
  • 密碼驗證建議改用 HMAC 或 JWT,避免明文傳輸。
  • 對 $rss_url 嚴格驗證協議(僅允許 http/https)與域名白名單,防止 SSRF 攻擊。
  • 大流量場景可引入 Redis/Memcached 緩存解析後的陣列,減少磁碟 I/O。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved