前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >RSS状态监控自动清理设计与实现

RSS状态监控自动清理设计与实现

原创
作者头像
C4rpeDime
发布2024-10-17 16:07:48
发布2024-10-17 16:07:48
10800
代码可运行
举报
文章被收录于专栏:HackTips
运行总次数:0
代码可运行

本文档介绍了一个用于监控 RSS URL 状态并自动清理无效链接的 Demo。该 Demo 通过前后端协作,实时检查数据库中存储的 RSS URL 是否有效,并在发现失效链接时进行自动清理。Demo 的功能包括分页展示、异步状态检查和自动删除失效 URL。

功能模块概述

  1. RSS URL 状态展示与分页:通过前端页面展示 RSS URL 数据,并支持分页显示,方便查看大量数据。
  2. RSS URL 状态检查:异步检查每个 RSS URL 的 HTTP 状态码,判断其是否有效。
  3. 自动删除无效 RSS URL:自动检测到无效链接后,删除数据库中对应的记录,保持数据的准确性。

模块详细设计

1. RSS URL 状态展示模块(前端)

1.1 模块描述

该模块的主要任务是从数据库中提取 RSS URL 数据并通过表格形式进行展示。同时,通过 JavaScript 实现异步 URL 状态检查,并更新表格中的状态列。

1.2 功能点
  • 分页展示:每次展示一定数量的 RSS URL 数据,避免一次加载过多内容。
  • 状态动态更新:页面加载后,开始逐条异步检查 RSS URL 的状态,并将结果实时更新到表格中。
  • 自动删除无效 URL:如果 RSS URL 状态码不为 200301302,则触发删除操作,将该条记录从数据库中移除。
1.3 代码实现

以下是前端页面的 HTML 和 PHP 代码,用于从数据库加载数据,并生成表格形式的展示。通过 jQuery 实现异步状态检查。

代码语言:javascript
代码运行次数:0
复制
<?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();
?>

2. RSS URL 状态检查模块(后端)

2.1 模块描述

该模块的任务是检查每个 RSS URL 的 HTTP 状态码,判断其是否有效。对于状态码为 200301302 的 URL,系统进一步检查其是否为有效的 RSS 页面。

2.2 功能点
  • HTTP 状态码检查:通过 get_headers 函数获取 URL 的状态码,并返回给前端。
  • RSS 有效性验证:进一步判断返回的页面是否为 RSS 页面,以确保 RSS URL 的正确性。
2.3 代码实现

check_url_status.php 用于处理状态检查的逻辑。

代码语言:javascript
代码运行次数:0
复制
<?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]);
?>

3. 自动删除无效 URL 模块(后端)

3.1 模块描述

该模块通过接收前端传递的 URL ID,删除数据库中对应的无效 RSS URL 记录,确保数据库只保留有效数据。

3.2 功能点
  • 安全删除操作:通过 id 参数传递 URL ID,确保删除操作仅影响指定记录。
  • 删除操作的反馈:返回 JSON 格式的删除结果,通知前端操作是否成功。
3.3 代码实现

delete_url.php 处理删除操作的逻辑。

代码语言:javascript
代码运行次数:0
复制
<?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();
?>

详细模块分析

1. 前端分页与状态展示

前端页面利用 PHP 从数据库中读取 RSS URL,并以表格形式展示。通过分页功能减少单次加载的数据量,避免页面响应缓慢。每个 URL 的状态通过表格的 status-cell 列展示,状态值在页面加载后异步获取并实时更新。

2. 异步状态检查与自动删除

通过 jQuery 对每个表格行发起异步 HTTP 请求(通过 check_url_status.php),判断该 URL 是否为有效的 RSS 页面。如果 URL 无效,前端会通过 delete_url.php 向后端发起删除请求。前端页面也会自动删除该无效条目的展示行,确保页面数据与数据库实时同步。

3. 后端处理逻辑

后端 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能模块概述
  • 模块详细设计
    • 1. RSS URL 状态展示模块(前端)
      • 1.1 模块描述
      • 1.2 功能点
      • 1.3 代码实现
    • 2. RSS URL 状态检查模块(后端)
      • 2.1 模块描述
      • 2.2 功能点
      • 2.3 代码实现
    • 3. 自动删除无效 URL 模块(后端)
      • 3.1 模块描述
      • 3.2 功能点
      • 3.3 代码实现
  • 详细模块分析
    • 1. 前端分页与状态展示
    • 2. 异步状态检查与自动删除
    • 3. 后端处理逻辑
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档