PHP源码 | 五个文件(压缩包仅14kb)的RSS订阅展示
这一期依旧是一篇源码分享文章,代码由Deepseek来写。我发布出来的都是自用项目,都是根据自己喜好来做的,没有考虑过做成产品面向其他人。如果有人愿意用的话都可以自己随意改。之后我还会多更新一些自己策划的项目。
介绍
首先讲为什么要做这个东西呢?我用过一段时间的FreshRSS,别的一些叫不出名字的程序、插件也用过,体验都没达到我的预期(甚至很难用)。
我想要一款真正干净、不容易出错、按时间排序的RSS订阅器。而且还要操作简单,不需要后台。所以我就让大肥鱼给我写了一个。风格依旧是我喜欢的千禧年Y2K。
看效果可以在我自己的订阅站看(https://rss.050601.xyz/ )。有两篇一模一样的文章是因为内容在两个博客都更新,不是bug。
文章后面都是说明文档了,也是大肥鱼自己写的,内容不长。
下载地址
因为压缩包很小(仅14kb)所以我直接放在这个博客的目录下了,不用再担心Kodbox失效什么的,欢迎下载使用!https://1103.wang/phptinyrss

Tiny RSS 文档说明
一个极简的 PHP RSS 阅读器。没有账号、没有后台、没有算法,只有订阅和文章。
特性
- 订阅源写在一个 feeds.json 里,改完点刷新即可
- 所有源的文章按发布时间倒序混排,新加的源自动穿插
- 顶部可按源筛选,底部按 20 条一页分页
- 打开页面读缓存,超过 6 小时自动重抓;也可以手动点刷新
- 某源抓取失败会顶部提示,点开看原因
- 浅色 / 深色模式,自动跟随系统,可手动切换
- 桌面 / 平板 / 手机响应式
文件结构
tiny-rss-php/
├─ feeds.json 订阅源列表
├─ lib.php 抓取、解析、缓存、分页
├─ api.php 前端数据接口
├─ index.php 首页
├─ 404.php 404 页
└─ cache/ 缓存目录(自动创建,需可写)
环境要求
- PHP 7.4+
- 扩展:curl、dom、libxml、json、mbstring
快速开始
本地运行
cd tiny-rss-php
php -S localhost:3000
打开 http://localhost:3000 ,首次访问会触发一次抓取。
Nginx 配置
把目录放到站点根目录,在 server { } 里加:
location = /feeds.json { deny all; }
location ^~ /cache/ { deny all; }
location = /lib.php { deny all; }
error_page 404 /404.php;
确保 cache/ 目录对 PHP 运行用户可写:
mkdir -p cache
chown -R www-data:www-data cache
chmod 775 cache
Apache 配置
在项目根目录建 .htaccess,内容如下:
<FilesMatch "^(feeds\.json|lib\.php)$">
Require all denied
</FilesMatch>
RedirectMatch 403 ^/cache/.*$
ErrorDocument 404 /404.php
cache/ 目录同样要可写。
配置订阅源
编辑 feeds.json,数组里每个元素一个源,字符串或对象都行:
[
"https://www.ruanyifeng.com/blog/atom.xml",
"https://sspai.com/feed",
{ "url": "https://hnrss.org/frontpage" }
]
改完回页面点「刷新」。
可调参数
都在 lib.php 顶部:
| 常量 | 默认 | 说明 |
|---|---|---|
| CACHE_TTL | 6 * 3600 | 缓存有效期(秒),超时自动重抓 |
| MAX_ITEMS_PER_FEED | 50 | 每个源最多保留条数 |
| PER_PAGE | 20 | 每页文章数 |
| SUMMARY_LEN | 120 | 摘要截取字数 |
| FETCH_TIMEOUT | 15 | 单源抓取超时(秒) |
常见问题
文章列表为空?
检查 feeds.json 格式是否正确,点「刷新」看顶部是否有抓取失败提示。
某个源文章比预期少?
可能该源使用了相对链接(如 /post/123),目前只接受 http/https 绝对链接。
想改样式?
index.php 顶部的 style 标签里,主题色都在 :root 和 html[data-theme="dark"] 两个块中。
端口冲突?
php -S localhost:8080 换个端口即可。
许可
自用项目,随意。









