©
This document uses PHP Chinese website manual Release
数据库缓存类允许您将查询缓存为文本文件,以减少数据库负载。
重要
当启用缓存时,该类由数据库驱动程序自动初始化。不要手动加载这个类。
重要
使用缓存时,并非所有查询结果函数都可用。请仔细阅读这一页。
缓存分三个步骤启用:
在您的服务器上创建一个可写目录,在那里可以存储缓存文件。
在应用程序/config/database.php文件中设置缓存文件夹的路径。
通过在application/config/database.php文件中设置首选项,或者手动地启用缓存特性,如下所述。
一旦启用,每当加载包含数据库查询的页面时,缓存将自动发生。
CodeIgniter的查询缓存系统在查看页面时动态发生。启用缓存时,首次加载网页时,查询结果对象将被序列化并存储在服务器上的文本文件中。下一次加载页面时,将使用缓存文件而不是访问数据库。对于已缓存的任何页面,您的数据库使用率可以有效地降至零。
只有读取类型(SELECT)查询可以被缓存,因为这些是产生结果的唯一类型的查询。写入类型(INSERT,UPDATE等)查询,因为它们不生成结果,不会被系统缓存。
缓存文件不会过期。任何已被缓存的查询将保留缓存,直到您将其删除。缓存系统允许您清除与单个页面关联的缓存,或者可以删除整个缓存文件集合。通常情况下,您需要使用下面介绍的内务管理功能在发生特定事件后删除缓存文件,例如在将新信息添加到数据库时。
由于缓存而获得性能增益取决于许多因素。如果您的负载非常轻微,并且具有高度优化的数据库,那么您可能看不到性能提升。如果你的数据库被大量使用,你可能会看到一个改进的响应,假设你的文件系统没有过度征税。请记住,缓存只会改变您的信息检索方式,将其从数据库操作转移到文件系统。
例如,在一些集群服务器环境中,由于文件系统操作非常激烈,缓存可能是有害的。在共享环境中的单个服务器上,缓存可能会有所帮助。不幸的是,你是否应该缓存数据库的问题没有单一的答案。这真的取决于你的情况。
CodeIgniter将每个查询的结果放入它自己的缓存文件中。缓存文件集进一步组织到与您的控制器功能相对应的子文件夹中。确切地说,子文件夹的名称与您的URI的前两个段(控制器类名称和函数名称)的名称完全相同。
例如,假设您有一个名为blog的控制器,其中包含一个名为comments的函数,其中包含三个查询。缓存系统将创建一个名为blog + comments的缓存文件夹,其中将写入三个缓存文件。
如果您使用基于URI中信息更改的动态查询(例如,在使用分页时),则查询的每个实例都将生成自己的缓存文件。因此,有可能最终获得的缓存文件比查询多得多。
由于缓存文件不会过期,因此您需要在应用程序中创建删除例程。例如,假设您有一个允许用户评论的博客。无论何时提交新评论,您都需要删除与提供评论的控制器功能相关联的缓存文件。您会发现下面介绍的两个删除功能,可帮助您清除数据。
最后,我们需要指出,被缓存的结果对象是完整结果对象的简化版本。出于这个原因,一些查询结果函数不可用。
当使用缓存的结果对象时,下列函数不可用:
NUM_FIELDS()
FIELD_NAMES()
field_data()
free_result()
此外,两个数据库资源(result_id和conn_id)在缓存时不可用,因为结果资源仅与运行时操作有关。
手动启用/禁用缓存。如果你想保持某些查询不被缓存,这会很有用。例:
// 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");
删除与特定页关联的缓存文件。如果您需要在更新数据库后清除缓存,这是非常有用的。
缓存系统将缓存文件保存到与您正在查看的页面的URI相对应的文件夹。例如,如果您正在example.com/index.php/blog/comments上查看页面,则缓存系统会将与其关联的所有缓存文件放在名为blog + comments的文件夹中。要删除您将使用的特定缓存文件:
$this->db->cache_delete('blog', 'comments');
如果不使用任何参数,则在确定应清除哪些内容时将使用当前URI。
清除所有现有的缓存文件。例子:
$this->db->cache_delete_all();