最近在开发一个内容聚合平台时,我遇到了一个让人头疼的问题:需要从数十个不同的网站抓取最新文章。这些网站的内容订阅源格式五花八门,有的提供 RSS 2.0,有的使用 Atom 1.0,甚至还有一些新兴的 JSONFeed。起初,我尝试手动编写解析器,针对每种格式编写不同的 XML 或 JSON 解析逻辑。
这很快就变成了一场噩梦。不同版本的 rss 或 atom 规范有细微差别,字段名称不统一,日期格式更是千奇百怪。更糟糕的是,如何判断一个订阅源是否有新的内容更新?我需要自己实现缓存机制,处理
if-modified-since
etag
Composer在线学习地址:学习地址
当我在苦苦寻找一个能够一劳永逸的解决方案时,
debril/feed-io
<pre class="brush:php;toolbar:false;">composer require debril/feed-io
安装完成后,
debril/feed-io
如何使用 debril/feed-io
统一内容读取:
debril/feed-io
read()
FeedInterface
<pre class="brush:php;toolbar:false;">use FeedIo\FeedIo; use FeedIo\Adapter\Http\Client as HttpClient; // 假设使用 Symfony HTTP Client use Symfony\Component\HttpClient\HttplugClient; use Psr\Log\NullLogger; // 使用一个空日志器 // 创建一个 HTTP 客户端实例 $client = new HttpClient(new HttplugClient()); // 创建 FeedIo 实例,需要传入 HTTP 客户端和日志器 $feedIo = new FeedIo($client, new NullLogger()); $url = 'http://php.net/feed.atom'; // 任意一个订阅源地址 $result = $feedIo->read($url); echo "订阅源标题: " . $result->getFeed()->getTitle() . PHP_EOL; foreach ($result->getFeed() as $item) { echo " - " . $item->getTitle() . PHP_EOL; }
智能增量更新: 我的一个主要痛点是只获取新的内容。
debril/feed-io
getItemsSince()
getNextUpdate()
<pre class="brush:php;toolbar:false;">// 假设 $lastModifiedDate 是你上次读取订阅源的时间 $lastModifiedDate = new \DateTime('-1 day'); // 比如,从一天前开始获取新内容 $result = $feedIo->read($url, null, $lastModifiedDate); echo "自上次更新以来新发布的文章:" . PHP_EOL; foreach ($result->getItemsSince() as $item) { echo " - " . $item->getTitle() . PHP_EOL; } // 估算下一次更新时间 $nextUpdate = $result->getNextUpdate(); echo "建议下次更新时间: {$nextUpdate->format(\DATE_ATOM)}" . PHP_EOL;
自动发现订阅源: 如果我只知道一个网站的首页地址,
debril/feed-io
discover()
<pre class="brush:php;toolbar:false;">$feeds = $feedIo->discover('https://www.php.net'); foreach ($feeds as $feedUrl) { echo "发现的订阅源: {$feedUrl}" . PHP_EOL; }
轻松发布自己的订阅源: 除了消费订阅源,
debril/feed-io
Feed
Item
Media
<pre class="brush:php;toolbar:false;">use FeedIo\Feed; use FeedIo\Feed\Item; use FeedIo\Feed\Item\Media; $myFeed = new Feed(); $myFeed->setTitle('我的博客最新文章'); $myFeed->setLink('https://myblog.com'); $myFeed->setDescription('分享我的技术见解'); $myFeed->setLastModified(new \DateTime()); $item = new Item(); $item->setTitle('Composer 深度解析'); $item->setLink('https://myblog.com/composer-deep-dive'); $item->setDescription('一篇关于 Composer 工作原理的文章。'); $item->setLastModified(new \DateTime('-1 hour')); $myFeed->add($item); // 生成 Atom 格式的订阅源字符串 $atomString = $feedIo->toAtom($myFeed); // echo $atomString; // 可以将此字符串作为 HTTP 响应返回
debril/feed-io
getItemsSince()
getNextUpdate()
debril/feed-io
通过引入
debril/feed-io
debril/feed-io
以上就是如何高效聚合和发布多源内容?debril/feed-io助你轻松构建内容中心的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号