# 数据库缓存类
数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。
>[danger] 重要
> 当缓存启用时,本类会被数据库驱动自动加载,切勿手动加载。
> 并非所有查询结果都能被缓存,请仔细阅读本页内容。
## 启用缓存
启用缓存需要三步:
* 在服务器上创建一个可写的目录以便保存缓存文件;
* 通过文件 application/config/database.php 中的 cachedir 参数设置其目录路径;
* 通过将文件 application/config/database.php 中的 cache_on 参数设置为 TRUE, 也可以用下面的方法手动配置。
缓存一旦启用,每一次加载页面时,只要该页面含有数据库查询就会自动缓存起来。
## 缓存是如何工作的?
当你在访问页面时,CodeIgniter 的查询缓存系统会自动运行。如果缓存被启用, 当页面第一次加载时,查询结果对象会被序列化并保存到服务器上的一个文本文件中。 当下次再访问该页面时,会直接使用缓存文件而不用访问数据库了,这样, 在已缓存的页面,你的数据库访问会降为 0 。
只有读类型(SELECT)的查询可以被缓存,因为只有这类查询才会产生结果。 写类型的查询(INSERT、UPDATE 等)并不会生成结果,所以不会被缓存。
缓存文件永不过期,所有的查询只要缓存下来以后除非你删除它们否则将一直可用。 你可以针对特定的页面来删除缓存,或者也可以清空掉所有的缓存。一般来说, 你可以在某些事件发生时(如数据库中添加了数据)用下面的函数来清除缓存。
## 缓存能够提升站点的性能吗?
缓存能否获得性能增益,取决于很多因素。如果你有一个低负荷而高度优化的 数据库,你可能不会看到性能的提升。而如果你的数据库正在被大量访问, 您可能会看到缓存后的性有所提升,前提是你的文件系统并没有太多的开销。 要记住一点的是,缓存只是简单的改变了数据获取的途径而已,从访问数据库 变成了访问文件系统。
例如,在一些集群服务器环境中,由于文件系统的操作太过频繁,缓存其实是 有害的。在共享的单一服务器环境中,缓存才可能有益。不幸的是,关于是否 需要缓存你的数据库这个问题并没有唯一的答案,这完全取决于你的情况。
## 缓存文件是如何存储的?
CodeIgniter 将每个查询都缓存到它单独的缓存文件中,根据调用的控制器方法 缓存文件被进一步组织到各自的子目录中。更准确的说,子目录是使用你 URI 的前两段(控制器名 和 方法名)命名的。
例如,你有一个 blog 控制器和一个 comments 方法,并含有三个不同的查询。 缓存系统将创建一个名为 blog+comments 的目录,并在该目录下生成三个 缓存文件。
如果你的 URI 中含有动态查询时(例如使用分页时),每个查询实例都会 生成它单独的缓存文件,因此,最终可能会出现缓存文件数是你页面中的 查询次数的好几倍这样的情况。
## 管理你的缓存文件
由于缓存文件不会过期,那么你的应用程序中应该有删除缓存的机制, 例如,我们假设你有一个博客并允许用户评论,每当提交一个新评论时, 你都应该删除掉关于显示评论的那个控制器方法对应的缓存文件。下面将介绍 有两种不同的方法用来删除缓存数据。
## 不是所有的数据库方法都兼容缓存
最后,我们必须得指出被缓存的结果对象只是一个简化版的结果对象, 正因为这样,有几个查询结果的方法无法使用。
下面列出的方法是无法在缓存的结果对象上使用的:
* num_fields()
* field_names()
* field_data()
* free_result()
同时,result_id 和 conn_id 这两个 id 也无法使用,因为这两个 id 只适用于实时的数据库操作。
### 函数参考
## $this->db->cache_on() / $this->db->cache_off()
用于手工启用/禁用缓存,当你不想缓存某些查询时,这两个方法会很有用。 例子:
~~~
// Turn caching on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");
// Turn caching off for this one query
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");
~~~
## $this->db->cache_delete()
删除特定页面的缓存文件,这当你更新你的数据库之后需要清除缓存时很有用。
缓存系统根据你访问页面的 URI 来将缓存写入到相应的缓存文件中去,例如, 如果你在访问 example.com/index.php/blog/comments 这个页面,缓存系统 会将缓存文件保存到 blog+comments 目录下,要删除这些缓存文件,你可以使用:
~~~
$this->db->cache_delete('blog', 'comments');
~~~
如果你没提供任何参数,将会清除当前 URI 对应的缓存文件。
## $this->db->cache_delete_all()
清除所有的缓存文件,例如:
~~~
$this->db->cache_delete_all();
~~~
- 欢迎使用 CodeIgniter
- 安装说明
- 下载 CodeIgniter
- 安装说明
- 从老版本升级
- 疑难解答
- CodeIgniter 概览
- CodeIgniter 将从这里开始
- CodeIgniter 是什么?
- 支持特性
- 应用程序流程图
- 模型-视图-控制器
- 设计与架构目标
- 教程 - 内容提要
- 加载静态内容
- 读取新闻条目
- 创建新闻条目
- 结束语
- 常规主题
- CodeIgniter URL
- 控制器
- 保留名称
- 视图
- 模型
- 辅助函数
- 使用 CodeIgniter 类库
- 创建类库
- 使用 CodeIgniter 驱动器
- 创建驱动器
- 创建核心系统类
- 创建附属类
- 钩子 - 扩展框架核心
- 自动加载资源
- 公共函数
- 兼容性函数
- URI 路由
- 错误处理
- 网页缓存
- 程序分析
- 以 CLI 方式运行
- 管理你的应用程序
- 处理多环境
- 在视图文件中使用 PHP 替代语法
- 安全
- PHP 开发规范
- 类库参考
- 基准测试类
- 缓存驱动器
- 日历类
- 购物车类
- 配置类
- Email 类
- 加密类
- 加密类(新版)
- 文件上传类
- 表单验证类
- FTP 类
- 图像处理类
- 输入类
- Javascript 类
- 语言类
- 加载器类
- 迁移类
- 输出类
- 分页类
- 模板解析类
- 安全类
- Session 类
- HTML 表格类
- 引用通告类
- 排版类
- 单元测试类
- URI 类
- 用户代理类
- XML-RPC 与 XML-RPC 服务器类
- Zip 编码类
- 数据库参考
- 数据库快速入门: 示例代码
- 数据库配置
- 连接你的数据库
- 查询
- 生成查询结果
- 查询辅助函数
- 查询构造器类
- 事务
- 数据库元数据
- 自定义函数调用
- 数据库缓存类
- 数据库工厂类
- 数据库工具类
- 数据库驱动器参考
- 辅助函数参考
- 数组辅助函数
- 验证码辅助函数
- Cookie 辅助函数
- 日期辅助函数
- 目录辅助函数
- 下载辅助函数
- 邮件辅助函数
- 文件辅助函数
- 表单辅助函数
- HTML 辅助函数
- 语言辅助函数
- Inflector 辅助函数
- 数字辅助函数
- 路径辅助函数
- 安全辅助函数
- 表情辅助函数
- 字符串辅助函数
- 文本辅助函数
- 排版辅助函数
- URL 辅助函数
- XML 辅助函数
- 向 CodeIgniter 贡献你的力量