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 命名空间实例说明
Jan 27 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
PHP防止图片盗用(盗链)的方法小结
Nov 11 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
php语法检查的方法总结
Jan 21 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 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
PHP二维数组去重算法
2016/12/17 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
退休感言
2014/01/28 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
安全标语口号
2014/06/09 职场文书
企业理念标语
2014/06/09 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
高三复习计划
2015/01/19 职场文书
2015年中个人总结范文
2015/03/10 职场文书
python单元测试之pytest的使用
2021/06/07 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
Nginx跨域问题解析与解决
2022/08/05 Servers