用php写友情链接RSS

发表于:2024-12-03 19:57:11

前几天看到了这个

感觉挺有意思的,之前再看imaegoo的时候看到了一个解决方案

去使用Inoreader 来实现,但是发现只适合hexo使用,php使用会导致报错

所以我就放弃了这个方法,我昨天突然想到用simplepie一个php的SDK来订阅rss,WordPress就用的这个方法,我就尝试了一下,果然可以!

打开simplepie官网下载sdk引用到你的PHP中 simplepie

效果如下:

开发步骤

1. 项目文件结构

创建以下文件结构:

project/
├── index.php           // 主文件
├── style.css           // 样式文件
├── includes/
│   └── header.php      // 页眉组件
├── cache/              // 用于存储 RSS 源缓存
├── php-sdk-7.14.0/     // PHP SDK(可选)
└── assets/
    ├── jquery.min.js   // 引用的 jQuery 库
    ├── semantic.min.css // Semantic UI 样式
    └── all.min.css     // Font Awesome 图标库

2. 引入必要的工具

require_once 'php-sdk-7.14.0/autoload.php';  // 确保 SDK 路径正确

确保安装了 SimpleXML 扩展和 PHP >= 7.0 的环境。

3. 添加 RSS 源

修改 $feeds 数组来添加订阅源:

$feeds = [
    'https://www.ruanyifeng.com/blog/atom.xml',
    'https://www.infoq.cn/feed',
    'https://sspai.com/feed',
    // 添加更多订阅源
];

4. 缓存机制

为了提高性能和减少网络请求,我们为每个订阅源设置了缓存:

  • 缓存位置cache/ 目录

  • 缓存时效:默认为 1 小时

  • 检查缓存逻辑

$cache_file = 'cache/' . md5($feed_url) . '.xml';
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
    $xml_content = file_get_contents($cache_file);
} else {
    // 获取新内容并更新缓存
    $context = stream_context_create([...]);
    $xml_content = file_get_contents($feed_url, false, $context);
    file_put_contents($cache_file, $xml_content);
}

5. 解析 RSS 数据

处理两种主要格式:

  • RSS 2.0 格式:
if (isset($xml->channel)) {
    $feed_title = (string)$xml->channel->title;
    foreach ($xml->channel->item as $item) {
        $all_items[] = [...];
    }
}
  • Atom 格式
else if (isset($xml->entry)) {
    $feed_title = (string)$xml->title;
    foreach ($xml->entry as $entry) {
        $all_items[] = [...];
    }
}

6. 分页功能

每页显示固定数量的文章:

$posts_per_page = 5;
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$total_pages = ceil($total_items / $posts_per_page);
$items = array_slice($all_items, $start, $posts_per_page);

分页按钮通过条件渲染实现:

if ($total_pages > 1) {
    echo '<a href="?page=' . $i . '" class="item">' . $i . '</a>';
}

7. 前端样式和脚本

加载 Semantic UI 和 jQuery:

<link rel="stylesheet" href="https://cdn.motsuni.cn/test/semantic.min.css">
<link rel="stylesheet" href="https://cdn.motsuni.cn/all.min.css">
<script src="https://cdn.motsuni.cn/jquery.min.js"></script>

自定义 CSS 优化内容:

.content {
    margin-left: 260px;
    padding-left: 60px;
}
@media (max-width: 768px) {
    .content {
        margin-left: 0;
    }
}

8. 页面渲染

将文章信息展示在主页面中:

foreach ($items as $item) {
    echo "
    <div class='ui segment'>
        <h2><a href='{$item['link']}' target='_blank'>{$item['title']}</a></h2>
        <p>发表于:".date('Y-m-d', $item['date'])." | 来源:{$item['source']}</p>
        <p>".mb_substr(strip_tags($item['content']), 0, 200)."...</p>
        <a href='{$item['link']}' class='ui button'>阅读全文</a>
    </div>";
}

9. 右侧栏功能

在右侧显示订阅源的标题和说明:

<div class="ui segment">
    <h3>订阅源</h3>
    <ul>
        <?php foreach ($feeds as $feed_url): ?>
            <li><a href="<?php echo $feed_url; ?>" target="_blank"><?php echo $feed_title; ?></a></li>
        <?php endforeach; ?>
    </ul>
</div>

三、部署与调试

  1. 确保 PHP 环境已正确配置,并允许 file_get_contents()

  2. 设置 cache/ 目录为可写(chmod 777)。

  3. 通过浏览器访问 index.php 查看效果。


四、项目扩展

  1. 添加分类标签:为每个 RSS 源配置类别。

  2. 用户交互:允许用户动态添加订阅源。

  3. 数据库支持:将 RSS 数据存储到数据库中,提供高级筛选功能。

  4. 多主题支持:支持切换白天和黑夜主题。

 

发表评论

最新评论

avatar

鸢栀

大佬过奖了

发表于:2024-12-04 16:37:10

来自:中国 - 安徽 - 合肥

avatar

沉沦 - 网站

你竟然是用这种方法实现的,太强了。我单纯抄的别人的方法。https://laozhang.org/archives/3579.html

发表于:2024-12-04 15:22:53

来自:中国 - 河北 - 保定