Zend_Cache简单介绍
Zend_Cache类是ZendFramework的一部分,用于(顾名思义)缓存内容。从前端浏览器输出到复杂计算的结果甚至数据库查询的结果,任何东西都可以。Zend_Cache是一个巨大的话题,不仅涉及类的工作原理,还涉及缓存的最佳实践。
从缓存开始的最佳位置是缓存数据库查询的较简单主题之一,从这一点出发,您可以继续了解其他缓存功能。通常,可以像这样完成对ZendFramework中数据库表的调用。
$houses = new Houses(); $result = $houses->fetchAll();
然后将处理结果。要使用Zend_Cache而不是调用数据库,我们首先需要设置Zend_Cache对象,以便我们可以使用它。为此,我们需要factory()使用一些参数调用Zend_Cache静态函数,这将为我们提供一个缓存对象。这是一个典型的例子。
$query_cache=Zend_Cache::factory('Core','File',$frontendoptions,$backendoptions);
参数如下:
'核心'-可以有许多不同的选项,这些选项决定在前端缓存什么类型的东西,这里的值映射到一个类。在这种情况下,该类是Zend_Cache_Core,但是其他类则映射到Zend_Cache_Frontend_*。Zend_Cache_Core类最适合用于数据库调用,因为没有特定的前端类可以处理数据库调用。
'文件'-指示在后端将缓存存储在何处。同样,此值映射到一个类,在本例中为Zend_Cache_Backend_File。在大多数情况下,Zend_Cache_Backend_File类是最简单,最容易使用的选项。
$frontendoptions-这是与您选择的前端类相关的选项数组。
$backendoptions-这是与您选择的后端类相关的选项数组。
以下代码使用一些常用参数设置Zend_Cache的实例。请注意,不同的前端类和后端类具有一组不同的参数,但是下面使用的参数用于Core前端和File后端。APPLICATION_PATH常量仅指向我们的应用程序文件夹。
$frontendoptions = array( 'lifetime' => 60 * 5, //5分钟 'automatic_serialization'=>true ); $backendoptions = array( 'cache_dir'=> APPLICATION_PATH . '/cache/', 'file_name_prefix' => 'zend_cache_query', 'hashed_directory_level' => 2 ); $query_cache = Zend_Cache::factory('Core', 'File', $frontendoptions, $backendoptions);
这是使用的前端选项的说明。
生命周期-这是不言而喻的。如果创建的缓存大于此参数的秒数,则删除缓存。如果我们不希望缓存永远持续下去,可以将其设置为null。
automatic_serialization-如果设置为true,这将自动序列化缓存数据。这使您可以存储诸如对象和数组之类的复杂数据。如果仅存储数字值或文本字符串,则可以将其设置为false。
这是使用的后端选项的说明。
cache_dir-这是要保留高速缓存的目录。默认值为/tmp/,但是最好将高速缓存保留在应用程序文件夹中,以便您可以在需要时手动管理文件。
file_name_prefix-设置要使用的文件名的开始,因为我要缓存数据库查询,因此我选择了zend_cache_query作为前缀。
hashed_directory_level-某些文件系统在单个目录中处理大量文件非常困难。此选项将缓存分为不同的级别或目录。默认值为0,但是在此示例中,我选择了2。这意味着我们的缓存文件将存储在2级目录中。
要加载缓存,我们使用load()函数。该函数采用一个标识高速缓存的参数,但是由于我们从houses表中获取所有数据,因此我们不必为此担心太多。如果不存在具有该名称的缓存,则该函数返回false。如果发生这种情况,我们将运行常规数据库查询,但是在每种情况下,$result变量都将包含我们的数据。
if ( !($result = $query_cache->load('allhouses')) ) { $houses = new Houses(); $result = $houses->fetchAll(); $query_cache->save($result, 'allhouses'); }
一旦运行了正常查询,我们就使用save()函数将结果保存到缓存中。其中包含我们要保存在第一个参数中的数据,以及与load()第二个参数中的函数相同的缓存名称。下次加载页面时,将加载缓存,而不是调用数据库。
我们还可以通过对缓存名称使用唯一的标识符,以相同的方式缓存单个数据行。假设有我们的房屋编号,我们可以执行以下操作:
$cacheName = 'house'.$id; if ( !($result = $query_cache->load($cacheName )) ) { $houses = new Houses(); $result = $houses->fetchRow($houses->select()->where('id = ?', $id)); $query_cache->save($result, $cacheName ); }
请注意,除了显示查询结果以外,您还需要执行其他操作,则需要直接访问数据库。无法通过缓存的对象与数据库进行交互。