ndejong/ cakephp-autocache-plugin
CakephpAutocachePlugin 是一个 CakePHP 2.2+ 插件,它使查询缓存变得与在模型查询中添加 'autocache'=>true 参数一样简单。
Requires
This package is not auto-updated.
Last update: 2024-09-24 03:56:21 UTC
README
CakephpAutocachePlugin 是一个 CakePHP 2.2+ 插件,它使查询缓存变得与在模型查询中添加 'autocache'=>true 参数一样简单。此插件是基于 Mark Scherer (https://github.com/dereuromark) 的建议制作的,感谢 Mark!
CakephpAutocachePlugin 的 PHPUnit 测试已确认与以下版本兼容:
- cakephp-2.6.0-RC1
- cakephp-2.5.7
- cakephp-2.4.10
- cakephp-2.3.10
- cakephp-2.2.9
注意:CakephpAutocachePlugin 使用 Cache 分组功能,该功能仅在 CakePHP 2.2 版本中可用 - 分组是在每个模型基础上定义的,因此对模型所做的更改将使同一模型的所有其他缓存数据无效。
下载
注意:此存储库已从其原始位置(2018-07)移动到:
安装
步骤 1 - 通过 github.com
将 CakephpAutocachePlugin 复制或符号链接到您的插件路径中名为 Autocache 的路径,如下所示:
app/Plugin/Autocache
请注意路径名称,名称是 "Autocache",而不是 AutocachePlugin 或 CakephpAutocachePlugin,它只是 Autocache。我之所以强调这一点,是因为这很容易出错,尤其是如果您是从 github 下载或从 tarball 中解压。
步骤 1 - 通过 composer
将以下内容添加到 composer.json 的 require 部分:"verbnetworks/cakephp-autocache-plugin": "dev-master"
步骤 2
请确保您已在 core.php 或 bootstrap.php 中设置了一个标准的 CakePHP 缓存配置。您可以将第一个缓存配置命名为 'default',并将其设置为基于文件的缓存,如下所示:
Cache::config('default', array('engine' => 'File'));
步骤 3
当您打开 bootstrap.php 时,告诉 Cake 加载插件,如下所示:
CakePlugin::load('Autocache');
步骤 4
告诉您的模型(s)它们 $actsAs Autocache,通过将以下内容添加到要为 Autocache 启用功能的模型定义的顶部部分。或者,您也可以将其放入 AppModel.php 中,从而为所有模型启用 Autocache
public $actsAs = array('Autocache.Autocache');
注意以下部分中的行为设置。
步骤 5
在您的查找查询中添加 'autocache' 参数,有关此处提供的各种选项的更多信息,请参阅下面的进一步说明,但它可以像 'autocache' => true 一样简单。
步骤 6
启动 AutocachePlugin 测试,它们都应该通过。
用法
查找参数选项
这是有趣的部分,也是 Autocache 在其使用简单性方面真正发光的地方,这里只有三个选项:
-
config (字符串) = 使用标准 Cake Cache::config('a_cache_name', ...) 指定的缓存名称
-
name (字符串) = 开发者可以通过指定它作为选项来覆盖自动生成的缓存键名称,这样做将为您提供小的性能提升,因为我们不需要序列化和 md5 来生成缓存键名称 - 有关缓存键名称生成的说明,请参阅下面的 Q&A。
-
flush (布尔值) = 您可以通过添加flush选项来强制从数据源重新加载,这将删除任何现有的缓存值,并用新的数据存储库查找结果替换它。
因为'config'选项是最常用的选项,所以我们通过以下方式使其易于访问。
-
如果'autocache'选项是布尔值,我们使用在将Autocache行为分配给模型时指定的缓存配置,即"默认缓存"参数。
-
如果'autocache'选项是字符串,我们使用此字符串作为要使用的缓存配置名称。
查找参数选项示例
$params = array('autocache'=>true)
$params = array('autocache'=>'default')
$params = array('autocache'=>array('config'=>'default'))
$params = array('autocache'=>array('name'=>'some_name'))
$params = array('autocache'=>array('flush'=>true))
前三个基本上是同一件事情,只是表述不同。
Model->autocache_is_from变量
我对于这个做法的智慧有过错误,尽管如此,它还是在那里。在Model find()返回结果给您之后,您可以通过检查Model->autocache_is_from来确定结果是否来自缓存。注意,如果您想要可移植的Model代码,您需要使用isset()来测试变量是否存在,因为如果没有该行为,变量将不会设置...
Autocache行为设置
-
cache_config_name_default << 定义了在查找查询包含'autocache'参数但没有明确的缓存配置名称时使用的默认缓存配置名称。默认名称是'default'。
-
cache_config_name_check << 告诉Autocache检查即将使用的缓存配置名称是否已经定义,这有助于您防止愚蠢的错误。默认情况下,当Configure::read('debug')大于0时,此参数将自动设置为true,否则为false。将此参数设置为false可能会有轻微的速度提升。
-
dummy_datasource << 定义了需要在数据库.php文件中定义的虚拟数据库名称。默认名称为'autocache',您不太可能需要更改此名称。
Autocache行为设置示例
从模型中:
$actsAs = array('Autocache.Autocache')
$actsAs = array('Autocache.Autocache',array('default_cache'=>'level_1'));
$actsAs = array('Autocache.Autocache',array('default_cache'=>'level_1','check_cache'=>false));
通过控制器通过行为"attach":
$this->MyModelName->Behaviors->attach('Autocache.Autocache',array('default_cache'=>'level_2'));
问题和答案
问题:关于缓存分组呢?回答:基于(Model + Cache Config)的分组是一个很好的主意,不幸的是,截至CakePHP 2.5.7,这似乎是不可能的,因为在对Cache::config()进行初始调用后,无法定义新的组。这种解决方案是实现每个组的配置,然而,如果您这样做,调用Cache::clear()似乎会导致随后的调用Cache::write()无法写入(FileEngine)缓存 - 我真的希望在这方面被证明是错误的,需要更多时间来解决,缓存分组是个好主意。
问题:我想对缓存时间、缓存位置等有更多控制。
回答:就在您面前 :) 实现此目的的方法是为要缓存的"东西"指定新的缓存配置。这允许您非常有趣,创建一个同时将数据缓存到APC而其他数据缓存到文件,并为每个数据建立不同时间框架的配置,例如:
Cache::config('default', array('engine' => 'APC', 'duration'=>'60 seconds'));
Cache::config('level_05', array('engine' => 'APC', 'duration'=>'5 second'));
Cache::config('level_1', array('engine' => 'APC', 'duration'=>'1 minute'));
Cache::config('level_2', array('engine' => 'APC', 'duration'=>'5 minute'));
Cache::config('level_3', array('engine' => 'APC', 'duration'=>'30 minute'));
Cache::config('level_4', array('engine' => 'File','duration'=>'4 hour'));
Cache::config('level_5', array('engine' => 'File','duration'=>'1 day'));
问题:Autocache是如何命名缓存的数据的?
回答:请查看_generateCacheName(),问题的关键是我们取所有查询参数,将它们序列化,并取结果的一个散列,从而确保每个查询都有一个有用的唯一名称 - 是的,这样做会有一些开销,但仍然比执行数据库查询要少!
问题:关于AutocacheSource(即虚拟源)是什么?
说明:为了防止在存在缓存结果时,CakePHP模型类对数据库进行完整请求,我们需要一种方法来快速使find()查询返回空,以便我们可以在afterFind()回调函数中重新注入结果——遗憾的是,这种行为需要多个.php文件,但这就是现状——仍然比之前在AppModel中粘贴代码的方法要整洁得多。
问题:历史是怎样的?
说明:AutocachePlugin是从AutocacheBehavior继承而来的,它是我在之前写的“为CakePHP实现自动模型数据缓存”的改进。我从“jamienay”在his automatic_query_caching中提出的一些想法中借鉴了。
问题:CakephpAutocachePlugin与CakephpAutocacheBehavior有什么不同之处?
说明:可能最大的“不同”是将find参数选项名称从'cache'更改为'autocache'——是的,选项名称更长,但更清晰,并且与命名规则更好地一致。其他内容包括,不再需要指定autocache数据源配置,我们自动处理它,同时可以通过dummy_datasource参数进行覆盖……这个插件使用起来更简单!