<rss>
<channel>
<item>
<title>...</title>
<link>...</link>
<description>...</description>
</item>
...
</channel>
</rss>
核心標籤:<title>、<link>、<description>
simplexml_load_file() 或 DOMDocument 載入 RSS//channel/item 節點集合<?php
function parseRSS($url) {
$xml = simplexml_load_file($url);
if (!$xml) return false;
$items = array();
foreach ($xml->xpath('//channel/item') as $item) {
$items[] = array(
'title' => (string)$item->title,
'link' => (string)$item->link,
'desc' => (string)$item->description,
'date' => isset($item->pubDate) ? strtotime($item->pubDate) : time()
);
}
return $items;
}
?>
CREATE TABLE rss_cache (
id INT AUTO_INCREMENT PRIMARY KEY,
feed_url VARCHAR(255) NOT NULL,
title VARCHAR(255),
link TEXT,
description TEXT,
pub_date DATETIME,
fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uniq_feed_link (feed_url, link(100))
);
<?php
function fetchAndCache($feedUrl, $pdo) {
$items = parseRSS($feedUrl);
if (!$items) return false;
$stmt = $pdo->prepare("INSERT IGNORE INTO rss_cache (feed_url,title,link,description,pub_date) VALUES (?,?,?,?,?)");
foreach ($items as $it) {
$stmt->execute([$feedUrl, $it['title'], $it['link'], $it['desc'], date('Y-m-d H:i:s', $it['date'])]);
}
return true;
}
// 讀取快取顯示
$stmt = $pdo->query("SELECT * FROM rss_cache WHERE feed_url='$feedUrl' ORDER BY pub_date DESC LIMIT 20");
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
header('Content-Type: application/json'); echo json_encode($items);callback(json_encode($items)) 支援 JSONP