徐善通的随笔

千里之行, 始于足下



php 生成rss订阅 返回xml内容


Rss简介

RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0。使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新。网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。

开始使用

rss订阅就是返回一个规范的xml数据
下面是一个Rss2.0文件规范示例

<?xml version="1.0" encoding="utf-8"?>  
<rss version="2.0">
    <channel>
        <title>媒体名称/发布内容网站名称</title>
        <description>内容提供都描述,介绍</description>
        <link>内容提供者网址</link>
        <generator>生成该频道的程序名字符串。</generator>
        <image>
            <url>LOGO图片地址(绝对地址)</url>
            <title>图片描述(alt)</title>
            <link>网站首页地址</link>
        </image>

        <item>
            <title><![CDATA[ 文章标题 ]]></title>
            <link>文章URL地址(绝对地址)</link>
            <description><![CDATA[ 摘要/全文 ]]></description>
            <guid>项目的唯一识别码</guid>
            <pubDate>Mon, 07 Jul 2014 13:42:28 +0800 发布时间</pubDate>
        </item>

    </channel>
</rss>

更多节点信息可以参考https://www.cnblogs.com/tuyile006/p/3691024.html

其中 每个item就是一篇内容, 生成xml时, 只要循环生成item再加上头尾即可

这里提供一个php类用来生成xml数据, 使用方法在下面

class Rss
{
    public $title = '徐善通的随笔';

    public $description = '徐善通的博客';

    public $link = 'http://xstnet.com';

    public $language = 'zh-cn';

    public $copyright = 'Copyright 2016,2020 xstnet.com';

    public $pubDate;

    public $generator = 'xstnet.com';

    public $items = [];

    public function __construct($data = [])
    {
        $this->setData($data);
    }

    public function setData($data)
    {
//        $this->pubDate = date("D, d M Y H:i:s ", strtotime($date)) . "GMT";
        foreach ($data as $key => $value) {
            $this->$key =  $value;
        }
    }

    public function __set($name, $value)
    {

    }

    public function setItem(array $item)
    {
        $this->items[] = $item;
    }

    public function renderRss() : string
    {
        return $this->renderHeader() . $this->renderItems() . $this->renderFooter();
    }

    public function renderItems()
    {
        $xml = '';
        foreach ($this->items as $data) {
            $xml .= "\t<item>\n\t";
            foreach ($data as $key => $value) {
                $xml .= "\t";
                switch ($key) {
                    case 'title' :
                        $xml .= sprintf('<title><![CDATA[ %s ]]></title>', $value);
                        break;
                    case 'description' :
                        $xml .= sprintf('<description><![CDATA[ %s ]]></description>', $value);
                        break;
                    case 'link' :
                        $xml .= sprintf('<link>%s</link>', $value);
                        break;
                    case 'pubDate' :
                        $xml .= sprintf('<pubDate>%s</pubDate>', $value);
                        break;
                    case 'guid' :
                        $xml .= sprintf('<guid>%s</guid>', $value);
                        break;
                }
                $xml .= "\n\t";
            }
            $xml .= "</item>\n";
        }

        return $xml;
    }

    public function renderHeader() : string
    {
        $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<rss version=\"2.0\">
<channel>
    <title>{$this->title}</title>
    <description>{$this->description}</description>
    <link>{$this->link}</link>
    <generator>{$this->generator}</generator>
    <image>
        <url>http://xstnet.com/favicon.ico</url>
        <title>徐善通的随笔</title>
        <link>http://xstnet.com</link>
    </image>\n";

        return $xml;
    }

    public function renderFooter() : string
    {
        return "</channel>\n</rss>";
    }
}

使用方法

// 使用
$rss = new Rss(); // 此处可传数据赋值

// $dataList 该数据应为查数据库得到
$dataList = [
    'id' => 1,
    'title' => '标题',
    'description' => '', // 可选
    'created_at' => time(),
];

foreach ($dataList as $value) {
    $item = [
        'title' => $value['title'],
        'description' => $value['description'],
        'link' => 'http://example.com/article-' . $value['id'],
        'pubDate' => date("D, d M Y H:i:s ", $value['created_at']) . "GMT",
        'guid' => 'http://example.com/article-' . $value['id'],
    ];
    $rss->setItem($item);
}

$xmlString = $rss->renderRss();

header('Content-Type:application/xml; charset=UTF-8');
echo $xmlString;

测试使用

可以直接在火狐浏览器直接打开网页, 如果是正确的内容会有提示订阅的消息,如
alt


作者: 徐善通
地址: https://www.xstnet.com/article-98.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1