数据库缓存
数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。
激活缓存需要三步:
- 在服务器上创建一个可写的目录以便保存缓存文件。
- 在文件 application/config/database.php 中设置其目录。
- 激活缓存特性,可以在文件 application/config/database.php 中设置全局选项,也可以用以本页下面的方法手动设置。
一旦被激活,每一次含有数据库查询的页面被加载时缓存就会自动发生。
当页面被浏览时CodeIgniter的查询缓存系统能够动态执行。如果缓存特性被激活,那么在此页面首次被加载时,数据库查询的结果对象将会被序列化并保存在你服务器的文本文件中。而页面再次被加载时缓存文件将会替代数据库查询。如此,在被缓存的页面中,你的数据库使用率会降至0。
只有 读类型(read-type) (SELECT) 查询会被缓存,因为只有这种查询会产生结果集。 写类型(Write-type) (INSERT, UPDATE, 等等) 查询,因为不会产生结果集,故缓存系统不对之进行缓存。
缓存文件不会过期,除非你删掉,否则任何被缓存了的查询会一直存在。缓存系统允许你按页面清除,或把所有缓存都清除掉。一般来说,你可以在某些事件(比如向数据库添加了数据)发生时用下面的函数来清除缓存。
缓存能否获得性能增益,取决于很多因素。如果您有一个负荷很少而高度优化的数据库,你可能不会看到性能提升。 如果您的数据库正在大量使用,您可能会看到缓存后带来的性能提升,前提是你的文件系统是并没有太多开销。在一些集群服务器环境,会出现这样的情况,因为文件系统的操作太过频繁,缓存无法正确生成。 在单一的服务器在共享的环境,高速缓存可能会是有益的。是否能有性能上的提升应还取决于您的数据库。这要看您的具体情况。
CI把每次查询的结果放置在自己的缓存文件里。根据你的控制器函数,缓存文件集将被进一步组织到子目录中。准确的话,子目录的名称由你的URI的前两段(控件器类名和函数名)决定。例如,假设你有一个控制器blog和一个comments函数,这个函数包括三个查询。缓存系统将创建一个叫做blog+comments的目录并在这个目录里创建三个缓存文件。当你根据URI上的信息动态查询时(例如使用分页),每次查询的实例将创建自己的缓存文件。因此,经过很多次查询后,缓存文件的个数可能比你查询的次数还多。
由于缓存文件不会过期,您需要在您的应用程序中写入删除缓存操作的代码。例如,假设您有一个博客,让用户发表评论。每当有新的评论被提交您一定希望在某个控制器的方法中删除缓存文件与控制器的功能。你会发现如下两个删除功能的介绍,可以帮助您清除数据。
可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如:
01 | // 打开缓存开关 |
02 | $this ->db->cache_on(); |
03 | $query = $this ->db->query( "SELECT * FROM mytable" ); |
04 | |
05 | // 使下面这条查询不被缓存 |
06 | $this ->db->cache_off(); |
07 | $query = $this ->db->query( "SELECT * FROM members WHERE member_id = '$current_user'" ); |
08 | |
09 | // Turn caching back on |
10 | $this ->db->cache_on(); |
11 | $query = $this ->db->query( "SELECT * FROM another_table" ); |
删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库。
缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录,同时把缓存文件存放在那个子目录中.缓存主目录就是您在application/config/database.php 里面设置的缓存目录. 例如, 如果您正在浏览地址为 example.com/index.php/blog/comments的页面, 缓存系统会把所有生成的缓存文件放进一个以 blog+comments做为名称的文件夹里. 如果您要删除关于刚才提到的这个例子与之对应的缓存文件 需要执行以下代码:
1 | $this ->db->cache_delete( 'blog' , 'comments' ); |
$this->db->cache_delete('blog', 'comments'),我在实际测试的时候不起作用,不知道为什么原因,不知道是不是小bug?但是下面的$this->db->cache_delete_all()是可以的,没有问题。
如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存。
清除所有所有的缓存文件。例子:
1 | $this ->db->cache_delete_all(); |
网页缓存
Codeigniter 支持缓存技术,以达到最快的速度。尽管CI已经相当高效了,但是网页中的动态内容、主机的内存CPU 和数据库读取速度等因素直接影响了网页的加载速度。 依靠网页缓存,你的网页可以达到近乎静态网页的加载速度,因为他们将程序输出的结果保存到硬盘上了。
CI支持每个页面单独缓存,而且可以设置缓存更新时间。当一个网页第一次被加载的时候,缓存文件将被保存到application/cache文件夹。 下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。
启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内:
1 | $this ->output->cache(n); |
其中 n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到 1秒。上面的代码可以放到任何一个 function 里面。他的出现顺序对缓存并没有影响,所以将它放在你认为最合乎逻辑的地方。一旦上面的代码放到了控制器的方法中,页面就会被缓存。
由于CI存储缓存文件的方式,只有通过 view 文件的输出才能被缓存。在缓存文件产生之前,请确保 application/cache 文件夹可写。
如果你不再想使用缓存,仅需将上面的代码从你的controller里面删除即可。注意: 这样做并不能让缓存文件立即消失,它将会自动过期并被删除。如果你想立即删除那些文件,就必须自己动手了。