PHP生成sitemap.xml地图函数


Posted in PHP onNovember 13, 2013
<?php/**
 *    网站地图更新控制器
 *
 *    @author    Garbin
 *    @usage    none
 */
class SitemapApp extends FrontendApp
{
    function __construct()
    {
        $this->SitemapApp();
    }
    function SitemapApp()
    {
        parent::__construct();
        $this->_google_sitemmap_file = ROOT_PATH . '/data/google_sitemmap.xml';
    }
    function index()
    {
        if (!Conf::get('sitemap_enabled'))
        {
            return;
        }
        $from = empty($_GET['from']) ? 'google' : trim($_GET['from']);
        switch ($from)
        {
            case 'google':
                $this->_output_google_sitemap();
            break;
        }
    }
    /**
     *    输出Google sitemap
     *
     *    @author    Garbin
     *    @return    void
     */
    function _output_google_sitemap()
    {
        header("Content-type: application/xml");
        echo $this->_get_google_sitemap();
    }
    /**
     *    获取Google sitemap
     *
     *    @author    Garbin
     *    @return    string
     */
    function _get_google_sitemap()
    {
        $sitemap = "";
        if ($this->_google_sitemap_expired())
        {
            /* 已过期,重新生成 */
            /* 获取有更新的项目 */
            $updated_items = $this->_get_updated_items($this->_get_google_sitemap_lastupdate());
            /* 重建sitemap */
            $sitemap = $this->_build_google_sitemap($updated_items);
            /* 写入文件 */
            $this->_write_google_sitemap($sitemap);
        }
        else
        {
            /* 直接返回旧的sitemap */
            $sitemap = file_get_contents($this->_google_sitemmap_file);
        }
        return $sitemap;
    }
    /**
     *    判断Google sitemap是否过期
     *
     *    @author    Garbin
     *    @return    boolean
     */
    function _google_sitemap_expired()
    {
        if (!is_file($this->_google_sitemmap_file))
        {
            return true;
        }
        $frequency = Conf::get('sitemap_frequency') * 3600;
        $filemtime = $this->_get_google_sitemap_lastupdate();
        return (time() >= $filemtime + $frequency);
    }
    /**
     *    获取上次更新日期
     *
     *    @author    Garbin
     *    @return    int
     */
    function _get_google_sitemap_lastupdate()
    {
        return is_file($this->_google_sitemmap_file) ? filemtime($this->_google_sitemmap_file) : 0;
    }
    /**
     *    获取已更新的项目
     *
     *    @author    Garbin
     *    @return    array
     */
    function _get_updated_items($timeline = 0)
    {
        $timeline && $timeline -= date('Z');
        $limit = 5000;
        $result = array();
        /* 更新的店铺 */
        $model_store =& m('store');
        $updated_store = $model_store->find(array(
            'fields'    => 'store_id, add_time',
            'conditions' => "add_time >= {$timeline} AND state=" . STORE_OPEN,
            'limit'     => "0, {$limit}",
        ));
        if (!empty($updated_store))
        {
            foreach ($updated_store as $_store_id => $_v)
            {
                $result[] = array(
                    'url'       => SITE_URL . '/index.php?app=store&id=' . $_store_id,
                    'lastmod'   => date("Y-m-d", $_v['add_time']),
                    'changefreq'=> 'daily',
                    'priority'  => '1',
                );
            }
        }
        /* 更新的文章 */
        $model_article =& m('article');
        $updated_article = $model_article->find(array(
            'fields'    => 'article_id, add_time',
            'conditions'=> "add_time >= {$timeline} AND if_show=1",
            'limit'     => "0, {$limit}",
        ));
        if (!empty($updated_article))
        {
            foreach ($updated_article as $_article_id => $_v)
            {
                $result[] = array(
                    'url'       => SITE_URL . '/index.php?app=article&act=view&article_id=' . $_article_id,
                    'lastmod'   => date("Y-m-d", $_v['add_time']),
                    'changefreq'=> 'daily',
                    'priority'  => '0.8',
                );
            }
        }
        /* 更新的商品 */
        $model_goods =& m('goods');
        $updated_goods = $model_goods->find(array(
            'fields'        => 'goods_id, last_update',
            'conditions'    => "last_update >= {$timeline} AND if_show=1 AND closed=0",
            'limit'         => "0, {$limit}",
        ));
        if (!empty($updated_goods))
        {
            foreach ($updated_goods as $_goods_id => $_v)
            {
                $result[] = array(
                    'url'       => SITE_URL . '/index.php?app=goods&id=' . $_goods_id,
                    'lastmod'   => date("Y-m-d", $_v['last_update']),
                    'changefreq'=> 'daily',
                    'priority'  => '0.8',
                );
            }
        }
        return $result;
    }
    /**
     *    生成Google sitemap
     *
     *    @author    Garbin
     *    @param     array $items
     *    @return    string
     */
    function _build_google_sitemap($items)
    {
        $sitemap = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n";
        $sitemap .= "    <url>\r\n        <loc>" . htmlentities(SITE_URL, ENT_QUOTES) . "</loc>\r\n        <lastmod>" . date('Y-m-d', gmtime()) . "</lastmod>\r\n        <changefreq>always</changefreq>\r\n        <priority>1</priority>\r\n    </url>";
        if (!empty($items))
        {
            foreach ($items as $item)
            {
                $sitemap .= "\r\n    <url>\r\n        <loc>" . htmlentities($item['url'], ENT_QUOTES) . "</loc>\r\n        <lastmod>{$item['lastmod']}</lastmod>\r\n        <changefreq>{$item['changefreq']}</changefreq>\r\n        <priority>{$item['priority']}</priority>\r\n    </url>";
            }
        }
        $sitemap .= "\r\n</urlset>";
        return $sitemap;
    }
    /**
     *    写入Google sitemap文件
     *
     *    @author    Garbin
     *    @param     string $sitemap
     *    @return    void
     */
    function _write_google_sitemap($sitemap)
    {
        file_put_contents($this->_google_sitemmap_file, $sitemap);
    }
}

?>
PHP 相关文章推荐
php中目录,文件操作详谈
Mar 19 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
PHP、Java des加密解密实例
Apr 27 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
使用PHP静态变量当缓存的方法
Nov 13 #PHP
使用phpQuery采集网页的方法
Nov 13 #PHP
phpQuery占用内存过多的处理方法
Nov 13 #PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 #PHP
php堆排序(heapsort)练习
Nov 13 #PHP
php生成EAN_13标准条形码实例
Nov 13 #PHP
使用php计算排列组合的方法
Nov 13 #PHP
You might like
第三节--定义一个类
2006/11/16 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
菜鸟javascript基础资料整理2
2010/12/06 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python之文字转图片方法
2018/05/10 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
浅谈python之新式类
2018/08/12 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
python字典的遍历3种方法详解
2019/08/10 Python
python爬虫 正则表达式解析
2019/09/28 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
what is the difference between ext2 and ext3
2013/11/03 面试题
EJB实例的生命周期
2016/10/28 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
法院实习人员自我鉴定
2013/09/26 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
大学生个人自荐信
2014/02/24 职场文书
致共产党员倡议书
2014/04/16 职场文书
小学班主任事迹材料
2014/12/17 职场文书