You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter3中如何实现/sitemap.xml页面每日缓存与刷新?

嘿,我来帮你搞定CodeIgniter3里缓存sitemap.xml且每日自动刷新的需求!结合你提到的Site类,咱们一步步来实现:

1. 改造Site类的sitemap生成函数,加入缓存逻辑

首先,我们要在生成sitemap的函数里加入缓存判断逻辑——先检查有没有有效缓存,有就直接返回;没有就生成新的sitemap并缓存一天(86400秒)。

假设你的Site类里原来的sitemap函数是这样的,我们来修改它:

public function sitemap()
{
    // 加载CI的缓存驱动,这里用文件缓存(你也可以换成Redis/Memcached,后面说配置)
    $this->load->driver('cache', array('adapter' => 'file'));

    // 定义缓存键名,随便取个好识别的就行
    $cache_key = 'site_sitemap_xml';

    // 先检查缓存是否存在且有效
    if ($cached_content = $this->cache->get($cache_key)) {
        // 直接输出缓存的XML内容,记得设置正确的Content-Type
        $this->output
             ->set_content_type('application/xml')
             ->set_output($cached_content);
        return;
    }

    // 下面是你原来的sitemap生成逻辑——获取数据、渲染视图
    // 示例:获取需要加入sitemap的内容(比如文章、页面)
    $sitemap_data = array(
        'articles' => $this->article_model->get_all_published(),
        'pages' => $this->page_model->get_all_static_pages()
    );

    // 渲染sitemap视图(把数据传入,返回字符串形式的XML)
    $fresh_sitemap = $this->load->view('sitemap_template', $sitemap_data, TRUE);

    // 把新生成的sitemap缓存起来,有效期设为24小时(86400秒)
    $this->cache->save($cache_key, $fresh_sitemap, 86400);

    // 输出最终的XML内容
    $this->output
         ->set_content_type('application/xml')
         ->set_output($fresh_sitemap);
}
2. 配置缓存适配器

要让缓存正常工作,得先在application/config/cache.php里配置好缓存适配器。如果用文件缓存,确保设置的缓存目录有读写权限:

$config['adapter'] = 'file'; // 缓存适配器类型
$config['cache_path'] = APPPATH . 'cache/'; // 缓存文件存放目录,必须可读写

如果想用Redis或Memcached,只需要把adapter改成对应的名称,再补充相应的配置参数就行(比如Redis的主机、端口)。

3. 实现每日自动刷新(主动触发)

上面的逻辑是被动缓存——缓存到期后,用户第一次访问会自动重新生成。如果你想主动在每天固定时间(比如凌晨)刷新缓存,避免用户遇到首次访问的延迟,可以结合CLI命令和系统定时任务来实现:

第一步:创建CLI专用控制器

新建一个Cache_controller.php放在application/controllers目录下,用来处理缓存刷新任务:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Cache_controller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        // 限制只有CLI模式能访问这个控制器,防止被外网调用
        if (!$this->input->is_cli_request()) {
            show_404();
        }
        // 加载你的Site类(根据实际类名调整,比如是模型就用load->model)
        $this->load->library('Site'); // 假设你的Site类是库文件
    }

    // 刷新sitemap缓存的方法
    public function refresh_sitemap()
    {
        $this->load->driver('cache', array('adapter' => 'file'));
        $cache_key = 'site_sitemap_xml';

        // 先删除旧缓存(可选,也可以直接调用sitemap方法覆盖)
        $this->cache->delete($cache_key);

        // 调用Site类的sitemap方法,重新生成并缓存
        $this->Site->sitemap();

        echo "Sitemap cache refreshed successfully at " . date('Y-m-d H:i:s') . "\n";
    }
}

第二步:设置系统定时任务

Linux系统(Cron)

打开终端,输入crontab -e,添加一条定时任务,比如每天凌晨2点执行刷新:

0 2 * * * php /your/codeigniter/project/path/index.php cache_controller refresh_sitemap

注意替换成你项目的实际路径。

Windows系统(任务计划程序)

创建一个新任务,设置触发时间为每天凌晨2点,执行程序选择php.exe,参数填:

C:\your\codeigniter\project\path\index.php cache_controller refresh_sitemap
4. 关键注意事项
  • 确保缓存目录有读写权限:如果用文件缓存,APPPATH/cache目录必须让服务器进程能读写,否则缓存会失效。
  • 缓存适配器选择:如果你的项目是高并发场景,建议用Redis或Memcached代替文件缓存,性能更好。
  • 被动vs主动刷新:被动刷新足够满足大多数场景,主动刷新适合对首屏加载速度要求极高的项目。

内容的提问来源于stack exchange,提问作者web user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:31:31