最近在开发一个内容聚合平台时,我遇到了一个让人头疼的问题:需要从数十个不同的网站抓取最新文章。这些网站的内容订阅源格式五花八门,有的提供 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号