本文档介绍了一个用于监控 RSS URL 状态并自动清理无效链接的 Demo。该 Demo 通过前后端协作,实时检查数据库中存储的 RSS URL 是否有效,并在发现失效链接时进行自动清理。Demo 的功能包括分页展示、异步状态检查和自动删除失效 URL。
该模块的主要任务是从数据库中提取 RSS URL 数据并通过表格形式进行展示。同时,通过 JavaScript 实现异步 URL 状态检查,并更新表格中的状态列。
200
、301
或 302
,则触发删除操作,将该条记录从数据库中移除。以下是前端页面的 HTML 和 PHP 代码,用于从数据库加载数据,并生成表格形式的展示。通过 jQuery 实现异步状态检查。
<?php
// 允许所有来源访问
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 86400");
// 数据库连接
$host = "localhost";
$username = "root";
$password = "123456";
$dbname = "123456";
$conn = new mysqli($host, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 定义每页显示的条目数
$items_per_page = 2000;
// 获取当前页数
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$current_page = max($current_page, 1); // 确保页数为正数
$start = ($current_page - 1) * $items_per_page;
// 从表中获取数据
$sql = "SELECT id, url, title FROM Rssapi LIMIT ?, ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $start, $items_per_page);
$stmt->execute();
$result = $stmt->get_result();
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RSS API 状态检查</title>
<link href="//cdn.staticfile.net/twitter-bootstrap/4.6.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h2>RSS API 状态检查</h2>
<table class="table mt-3">
<thead>
<tr>
<th>ID</th>
<th>URL</th>
<th>标题</th>
<th>状态</th>
</tr>
</thead>
<tbody id="rss-data">
<?php if ($result->num_rows > 0): ?>
<?php while ($row = $result->fetch_assoc()): ?>
<tr data-id="<?= htmlspecialchars($row['id']) ?>" data-url="<?= htmlspecialchars($row['url']) ?>">
<td><?= htmlspecialchars($row['id']) ?></td>
<td><?= htmlspecialchars($row['url']) ?></td>
<td><?= htmlspecialchars($row['title']) ?></td>
<td class='status-cell'>检查中...</td>
</tr>
<?php endwhile; ?>
<?php else: ?>
<tr><td colspan='4'>暂无数据</td></tr>
<?php endif; ?>
</tbody>
</table>
<!-- 分页链接 -->
<ul class="pagination justify-content-center mt-4">
<?php
// 计算总页数
$total_sql = "SELECT COUNT(*) AS total FROM Rssapi";
$total_result = $conn->query($total_sql);
$total_row = $total_result->fetch_assoc();
$total_pages = ceil($total_row['total'] / $items_per_page);
// 输出分页链接
for ($i = 1; $i <= $total_pages; $i++): ?>
<li class='page-item <?= $i === $current_page ? 'active' : '' ?>'>
<a class='page-link' href='?page=<?= $i ?>'><?= $i ?></a>
</li>
<?php endfor; ?>
</ul>
</div>
<script src="//cdn.staticfile.net/jquery/3.6.0/jquery.min.js"></script>
<script>
// 页面加载后,开始异步检查 URL 状态
$(document).ready(function () {
$('#rss-data tr').each(function () {
const row = $(this);
const url = row.data('url');
const id = row.data('id');
// 发送异步请求获取 URL 状态
$.getJSON('check_url_status.php', { url: url })
.done(function (data) {
const status = data.status;
const isRss = data.is_rss; // 检查是否为 RSS 页面
row.find('.status-cell').text(status);
// 如果状态不是 200, 301 或者 302,或者不是 RSS 页面,则删除该条目
if (![200, 301, 302].includes(parseInt(status)) || !isRss) {
$.post('delete_url.php', { id: id })
.done(function (response) {
if (response.success) {
row.remove();
console.log('已删除 URL: ' + url);
} else {
console.log('删除失败: ' + response.error);
}
});
}
})
.fail(function () {
row.find('.status-cell').text('检查失败');
});
});
});
</script>
</body>
</html>
<?php
$stmt->close();
$conn->close();
?>
该模块的任务是检查每个 RSS URL 的 HTTP 状态码,判断其是否有效。对于状态码为 200
、301
或 302
的 URL,系统进一步检查其是否为有效的 RSS 页面。
get_headers
函数获取 URL 的状态码,并返回给前端。check_url_status.php
用于处理状态检查的逻辑。
<?php
<?php
header('Content-Type: application/json');
$url = $_GET['url'] ?? '';
// 获取 URL 的 HTTP 状态码
function get_http_response_code($url) {
$headers = @get_headers($url);
if ($headers) {
return substr($headers[0], 9, 3);
} else {
return '999'; // 无效的状态码
}
}
// 检查 URL 是否为有效的 RSS 页面
function is_rss_page($url) {
$http_code = get_http_response_code($url);
if (!in_array($http_code, ['200', '301', '302'])) {
return false; // 不是有效状态
}
// 获取内容并检查是否包含 RSS 格式
$content = @file_get_contents($url);
// 检查内容是否包含 <rss>、<feed>、<channel> 或 <item> 标签
return strpos($content, '<rss') !== false || strpos($content, '<feed') !== false || strpos($content, '<channel') !== false || strpos($content, '<item') !== false;
}
$status = get_http_response_code($url);
$rss_check = is_rss_page($url);
echo json_encode(['status' => $status, 'is_rss' => $rss_check]);
?>
该模块通过接收前端传递的 URL ID,删除数据库中对应的无效 RSS URL 记录,确保数据库只保留有效数据。
id
参数传递 URL ID,确保删除操作仅影响指定记录。delete_url.php
处理删除操作的逻辑。
<?php
header('Content-Type: application/json');
// 数据库连接
$conn = new mysqli("localhost", "root", "123456", "root");
// 检查连接
if ($conn->connect_error) {
echo json_encode(['success' => false, 'error' => $conn->connect_error]);
exit();
}
$id = $_POST['id'] ?? 0;
if ($id > 0) {
// 获取要删除条目的信息
$sql_select = "SELECT url, title FROM Rssapi WHERE id = ?";
$stmt_select = $conn->prepare($sql_select);
$stmt_select->bind_param("i", $id);
$stmt_select->execute();
$result = $stmt_select->get_result();
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$url = $row['url'];
$title = $row['title'];
// 删除条目
$sql_delete = "DELETE FROM Rssapi WHERE id = ?";
$stmt_delete = $conn->prepare($sql_delete);
$stmt_delete->bind_param("i", $id);
$success = $stmt_delete->execute();
if ($success) {
// 创建日志文件
$log_file = __DIR__ . '/logs/delete_log.txt';
if (!is_dir('logs')) {
mkdir('logs', 0755, true); // 如果日志目录不存在,创建目录
}
$timestamp = date('Y-m-d H:i:s');
$log_message = "[$timestamp] 删除了 ID: $id, URL: $url, 标题: $title\n";
file_put_contents($log_file, $log_message, FILE_APPEND | LOCK_EX);
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => $stmt_delete->error]);
}
$stmt_delete->close();
} else {
echo json_encode(['success' => false, 'error' => '无效的 ID']);
}
$stmt_select->close();
} else {
echo json_encode(['success' => false, 'error' => '无效的 ID']);
}
$conn->close();
?>
前端页面利用 PHP 从数据库中读取 RSS URL,并以表格形式展示。通过分页功能减少单次加载的数据量,避免页面响应缓慢。每个 URL 的状态通过表格的 status-cell
列展示,状态值在页面加载后异步获取并实时更新。
通过 jQuery 对每个表格行发起异步 HTTP 请求(通过 check_url_status.php
),判断该 URL 是否为有效的 RSS 页面。如果 URL 无效,前端会通过 delete_url.php
向后端发起删除请求。前端页面也会自动删除该无效条目的展示行,确保页面数据与数据库实时同步。
后端 check_url_status.php
文件的主要功能是根据传入的 URL 返回 HTTP 状态码和是否为有效的 RSS 页面。delete_url.php
文件负责根据 ID 删除无效的 RSS URL。
该 Demo 实现了一个简易的 RSS URL 监控与自动清理机制,通过前后端协作实时监控 RSS 链接的状态,并在发现无效链接时及时删除。虽然这是一个基础 Demo,但其设计思路具有较好的可扩展性,能够进一步完善为支持大规模 RSS 监控的工具。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。