数据库缓存类
数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。
重要提示: 本类在激活后会随数据库驱动自动初始化。切勿手动加载。
另: 并非所有查询结果都能被缓存。请仔细阅读本页内容。
激活缓存
激活缓存需要三步:
- 在服务器上创建一个可写的目录以便保存缓存文件。
- 在文件 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();