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 相关文章推荐
apache+php完美解决301重定向的两种方法
Jun 08 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
php实现数组重复数字统计实例
Sep 30 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
python重试装饰器示例
2014/02/11 Python
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python+django实现文件上传
2016/01/17 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
详解Python_shutil模块
2019/03/15 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
数学专业推荐信范文
2013/11/21 职场文书
物理教师自荐信范文
2013/12/28 职场文书
行政办公室岗位职责
2014/03/18 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
迎国庆横幅标语
2014/10/08 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python