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 相关文章推荐
一个MYSQL操作类
Nov 16 PHP
PHP学习资料汇总与网址
Mar 16 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
安装docker和docker-compose实例详解
Jul 30 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 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
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
详解 vue.js用法和特性
2017/10/15 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
总经理职责范文
2013/11/08 职场文书
《燕子》教学反思
2014/02/18 职场文书
地质灾害防治方案
2014/05/14 职场文书
先进员工获奖感言
2014/08/14 职场文书
单位证明范文
2015/06/18 职场文书
2015年度女工工作总结
2015/10/22 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
java版 简单三子棋游戏
2022/05/04 Java/Android