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
相关产品推荐
相关产品推荐

