nilsglow/cakephp-autocache-plugin

本包最新版本(dev-master)没有可用的许可证信息。

CakephpAutocachePlugin 是一个 CakePHP 2.2+ 插件,使得查询缓存变得与添加 'autocache'=>true 参数到你的模型查询一样简单。

安装: 29

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 12

类型:cakephp-plugin

dev-master 2016-11-29 13:49 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:32:05 UTC


README

从以下链接 Fork:https://github.com/ndejong/CakephpAutocachePlugin

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 使用了缓存分组功能,该功能仅在 CakePHP 2.2 版本中可用。组是在每个模型的基础上定义的,因此对模型所做的更改将使同一模型的所有其他缓存数据无效。

下载

安装

步骤 1 - 通过 github.com

将 CakephpAutocachePlugin 复制或符号链接到你的插件路径中名为 Autocache 的路径,如下所示:

app/Plugin/Autocache

请注意路径名,名称是 "Autocache",不是 AutocachePlugin 或 CakephpAutocachePlugin,只是 Autocache。我之所以强调这一点,是因为这是一个很容易出错的地方,尤其是如果你是从 github 拉取或者从 tarball 解包。

步骤 1 - 通过 composer

将以下内容添加到你的 composer.json 文件中 require 部分:"ndejong/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');

注意以下部分中可能的 Behavior 设置。

步骤 5

在你的 find 查询中添加一个 'autocache' 参数,下面将进一步介绍这里可用的各种选项,但它可以像这样简单:'autocache' => true。

步骤 6

启动 AutocachePlugin 测试,它们都应该通过。

用法

查找参数选项

这是有趣的部分,也是 Autocache 在使用简单性方面真正发光的地方,这里只有三个选项:

  • config (字符串) = 使用标准 Cake Cache::config('a_cache_name', ...) 指定缓存的名称

  • name (字符串) = 开发者可以通过指定一个选项来覆盖自动生成的缓存键名,这样做将为你带来一点性能提升,因为我们不必进行序列化和 md5 来生成缓存键名 - 下面 Q&A 部分有关于缓存键名生成的说明。

  • flush (布尔值) = 你可以通过添加一个 flush 选项来强制从数据源重新加载,这将删除任何现有的缓存值,并用新鲜的数据存储查找结果替换它。

由于 'config' 选项是最常用的选项,我们使其以下方式易于访问。

  • 如果 'autocache' 选项是布尔值,我们使用在将 Autocache Behavior 分配给模型时指定的缓存配置,即 "default_cache" 参数

  • 如果“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))

前三个基本上是同一件事情的不同表达方式。

模型->autocache_is_from变量

尽管我对此举的智慧提出了质疑,但它确实存在。当从Model find()方法返回结果给你后,你可以检查Model->autocache_is_from以确定结果是否来自缓存。请注意,如果你想要一个可移植的Model代码,你需要使用isset()来测试变量是否存在,因为如果该行为不存在,变量将不会被设置...

Autocache行为设置

  • cache_config_name_default << 定义了当find查询包含一个没有明确缓存配置名称的'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'));

问题和答案

问:关于缓存分组呢?答:基于(模型+缓存配置)的分组是一个好主意,不幸的是,截至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在他的automatic_query_caching中提出的思想中借鉴了一些。

  • nicholasdejong.com/story/automatic-model-data-caching-cakephp
  • github.com/jamienay/automatic_query_caching

问:CakephpAutocachePlugin与CakephpAutocacheBehavior有什么不同?
说明:最大的改动可能是find参数选项名的更改,从'cache'变为'autocache'——是的,选项名变长了,但更清晰,并且与其它命名更一致。其他改动包括,不再需要指定autocache数据源配置,我们会自动处理,也可以通过dummy_datasource参数来覆盖。... 总之,这个插件使用起来更简单了!