目录搜索
欢迎目录快速参考图基本信息服务器要求许可协议变更记录关于CodeIgniter安装下载 CodeIgniter安装指导从老版本升级疑难解答介绍开始CodeIgniter 是什么?CodeIgniter 速记表支持特性应用程序流程图模型-视图-控制器架构目标教程内容提要加载静态内容创建新闻条目读取新闻条目结束语常规主题CodeIgniter URL控制器保留字视图模型辅助函数使用 CodeIgniter 类库创建你自己的类库使用 CodeIgniter 适配器创建适配器创建核心系统类钩子 - 扩展框架的核心自动装载资源公共函数URI 路由错误处理缓存调试应用程序以CLI方式运行管理应用程序处理多环境PHP替代语法安全开发规范类库参考基准测试类日历类购物车类配置类Email 类加密类文件上传类表单验证详解FTP 类图像处理类输入类Javascript 类语言类装载类迁移类输出类分页类模板解析器类安全类Session 类HTML 表格类引用通告类排版类单元测试类URI 类User-Agent 类表单验证XML-RPC 和 XML-RPC 服务器Zip 编码类缓存适配器适配器参考适配器数据库类Active Record 类数据库缓存类自定义函数调用数据库配置连接你的数据库数据库快速入门例子代码字段数据数据库维护类查询辅助函数数据库类查询生成查询记录集表数据事务数据库工具类JavaScript类辅助函数参考数组辅助函数CAPTCHA 辅助函数Cookie Helper日期辅助函数目录辅助函数下载辅助函数Email 辅助函数文件辅助函数表单辅助函数HTML辅助函数Inflector 辅助函数语言辅助函数数字辅助函数路径辅助函数安全辅助函数表情辅助函数字符串辅助函数文本辅助函数排版辅助函数URL 辅助函数XML 辅助函数
文字

CodeIgniter 用户指南 版本 2.1.0

编辑文档、查看近期更改请 登录 或 注册  找回密码
查看原文

数据库缓存类

数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。

重要提示:  本类在激活后会随数据库驱动自动初始化。切勿手动加载。

另:  并非所有查询结果都能被缓存。请仔细阅读本页内容。

激活缓存

激活缓存需要三步:

  • 在服务器上创建一个可写的目录以便保存缓存文件。
  • 在文件 application/config/database.php$db['xxxx']['cachedir'] 设置其目录。
  • 激活缓存特性,可以在文件 application/config/database.php 中设置全局选项$db['xxxx']['cache_on']='TRUE',也可以用以本页下面的方法手动设置。

一旦被激活,每一次含有数据库查询的页面被加载时缓存就会自动发生。

缓存如何工作?

当页面被浏览时CodeIgniter的查询缓存系统能够动态执行。如果缓存特性被激活,那么在此页面首次被加载时,数据库查询的结果对象将会被序列化并保存在你服务器的文本文件中。而页面再次被加载时缓存文件将会替代数据库查询。如此,在被缓存的页面中,你的数据库使用率会降至0。

只有 读类型(read-type) (SELECT) 查询会被缓存,因为只有这种查询会产生结果集。 写类型(Write-type) (INSERT, UPDATE, 等等) 查询,因为不会产生结果集,故缓存系统不对之进行缓存。

缓存文件不会过期,除非你删掉,否则任何被缓存了的查询会一直存在。缓存系统允许你按页面清除,或把所有缓存都清除掉。一般来说,你可以在某些事件(比如向数据库添加了数据)发生时用下面的函数来清除缓存。

缓存能够提升站点的性能吗?

缓存能否获得性能增益,取决于很多因素。如果您有一个负荷很少而高度优化的数据库,你可能不会看到性能提升。 如果您的数据库正在大量使用,您可能会看到缓存后带来的性能提升,前提是你的文件系统是并没有太多开销。(这里'CI中国社区'要补充一点:生成缓存以及索引缓存等一系列操作(缓存系统自身运算)也是存在开销的.) Remember that caching simply changes how your information is retrieved, shifting it from being a database operation to a file-system one.

在一些集群服务器环境,会出现这样的情况,因为文件系统的操作太过频繁,缓存无法正确生成。 在单一的服务器在共享的环境,高速缓存可能会是有益的。是否能有性能上的提升应还取决于您的数据库。这要看您的具体情况.

缓存文件如何存储?

CodeIgniter拥有每个 places the result of EACH query into its own cache file. Sets of cache files are further organized into sub-folders corresponding to your controller functions. To be precise, the sub-folders are named identically to the first two segments of your URI (the controller class name and function name).

CI把每次查询的结果放置在自己的缓存文件里。根据你的控制器函数,缓存文件集将被进一步组织到子目录中。准确的话,子目录的名称由你的URI的前两段(控件器类名和函数名)决定

For example, let's say you have a controller called blog with a function called comments that contains three queries. The caching system will create a cache folder called blog+comments, into which it will write three cache files.

例如,假设你有一个控制器blog和一个comments函数,这个函数包括三个查询。缓存系统将创建一个叫做blog+comments的目录并在这个目录里创建三个缓存文件。

If you use dynamic queries that change based on information in your URI (when using pagination, for example), each instance of the query will produce its own cache file. It's possible, therefore, to end up with many times more cache files than you have queries.

当你根据URI上的信息动态查询时(例如使用分页),每次查询的实例将创建自己的缓存文件。因此,经过很多次查询后,缓存文件的个数可能比你查询的次数还多。

管理您的缓存文件

由于缓存文件不会过期,您需要在您的应用程序中写入删除缓存操作的代码。例如,假设您有一个博客,让用户发表评论。每当有新的评论被提交 您一定希望在某个控制器的方法中删除缓存文件与控制器的功能 . 你会发现如下两个删除功能的介绍,可以帮助您清除数据.

并非所有的数据库方法都带缓存

最后,我们需要指出的是,由于对象是缓存 是一个简化版本的全部结果对象。出于这一原因,一些不具备数据查询结果的方法不被缓存 如 插入 更新。.

下列方法不能和缓存搭配使用:

  • num_fields()
  • field_names()
  • field_data()
  • free_result()

同样, the two database resources (result_id and conn_id) are not available when caching, since result resources only pertain to run-time operations.


函数参考

$this->db->cache_on()  /   $this->db->cache_off()

可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如::

// 打开缓存开关
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// 使下面这条查询不被缓存
$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()

删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库.

缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录,同时把缓存文件存放在那个子目录中.缓存主目录就是您在application/config/database.php 里面设置的缓存目录. 例如, 如果您正在浏览地址为 example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog+comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:

$this->db->cache_delete('/blog', 'comments'); 注意,手册上写的是 $this->db->cache_delete('blog', 'comments');但根据实际测试应该在控制器名字前加斜杠'/'才能正确执行。

如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存.

$this->db->cache_delete_all()

清除所有所有的缓存文件。例子:

$this->db->cache_delete_all();

 

翻译贡献者: airyland, baiyuxiong, Drice, Hex, iptton, mchipengfei, soyota, yz20sui, 笼中
最后修改: 2011-12-10 18:58:38
上一篇:下一篇: