Zend如何使用缓存组件

时间:2011-06-07 10:08:36

标签: php zend-framework cache-control

假设你有这种情况:一个简单的博客主页,它既可以加载静态内容,也可以加载动态内容。 静态内容由很少变化的图像组成。我还有数据库驱动的动态内容。动态内容包含所有博客文章(文本和图像)和相关用户评论。动态内容定期从每小时变化到每一天。

你会如何使用缓存?特别是假设用户正在发表评论或管理员正在添加/编辑帖子,您希望手动触发缓存清除以获得此博客主页的更新版本?

感谢您的耐心等待。

卢卡

再次感谢

4 个答案:

答案 0 :(得分:9)

首先,链接:http://framework.zend.com/manual/1.11/en/zend.cache.html

基本上,您需要做的是设置缓存机制,然后在想要从缓存中检索内容时手动调用它。

在bootstrap中,我可能有这段代码:

public function _initCache () {
    $cache = Zend_Cache::factory(
        'Core',
        'File',
        array(
            'lifetime' => 3600 * 24, //cache is cleaned once a day
            'automatic_serialization' => true
        ),
        array('cache_dir' => APPLICATION_PATH.'/cache')
    );
    Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); //cache database table schemata metadata for faster SQL queries
    Zend_Registry::set('Cache', $cache);
}

然后,您可以使用load()和save()函数来操作缓存。我的控制器的一个例子:

$cache = Zend_Registry::get('Cache');
if (!$this->menu = $cache->load('main_menu')) {
    $model = new Model_Menu();
    $this->menu = $model->get();
    $cache->save($this->menu,'main_menu');
}

在这里,我检查是否缓存了密钥“main_menu”。如果对缓存未命中进行评分,则会生成并缓存主菜单。

如果我编辑主菜单,我也想重新生成缓存。我简单地称之为:

Zend_Registry::get('Cache')->remove('main_menu');

这很简单,只需阅读文档即可。写得很好。

答案 1 :(得分:6)

Zend缓存提供了一种在缓存中存储数据并提高速度的非常简单的方法。 Zend使用前端和后端来缓存。前端对于访问或操作缓存很有用。后端对于在File,memcache,Sqlite等中存储数据非常有用。

首先通过在bootstrap文件中创建on函数来初始化前端和后备的bootstrap文件。

protected function _initCache(){

    $frontend= array(
        'lifetime' => 7200,
        'automatic_serialization' => true
    );

    $backend= array(
        'cache_dir' => '../application/tmp/',
    );

    $cache = Zend_Cache::factory('core',
            'File',
            $frontend,
            $backend
    );
    Zend_Registry::set('cache',$cache);
}

然后使用zend cache factory定义缓存对象。参数核心定义了zend缓存核心的泛型类型File参数是定义缓存存储意味着在哪里存储缓存的记录然后来回来自前端和后端。

现在使用zend注册表注册该缓存数组,以便您可以在任何控制器,模型等中使用它。

在任何控制器或任何想要使用数据缓存的模型中定义以下代码。

    $result1 =””;
    $cache = Zend_Registry::get('cache');

if(!$result1 = $cache->load('mydata')) {
        echo 'caching the data…..';
    $data=array(1,2,3);
    $cache->save($data, 'mydata');
} else {
    echo 'retrieving cache data…….';
    Zend_Debug::dump($result1);
}

首先在上面的代码中我们得到了缓存数组。现在,如果未设置结果1,则缓存完成意味着文件是在后端数组中定义的路径生成的

对于下一次页面加载,从缓存数据存储的文件中检索数据。

您可以按照定义的路径检查文件。

在该文件中,数据采用json格式。

答案 2 :(得分:4)

所以缓存的基本用法由@mingos显示。他谈到了通用缓存,这很好。但是,ZF几乎没有不同的缓存机制可用于不同的事情。您不需要为一种类型的缓存限制自己。你可以混合使用它们。例如,对于缓存静态内容Zend_Cache_Frontend_Page是值得考虑的,因为它会生成静态页面的完整html文件。如果你有很多配置文件,例如long routes.ini或其他什么,您可以使用Zend_Cache_Frontend_File缓存它们。有了这个,您可以节省解析每个请求的ini文件的时间。您可以使用Zend_Cache_Frontend_Output等来缓存视图的重要部分。

缓存内容以及何时更新缓存是一个棘手的问题。这完全取决于您的内容变化的速度和频率。例如,如果您每秒有100个新评论,那么每秒清理评论缓存100次是没有意义的(即每个新评论)。最好是对每个帖子的评论与其他帖子的评论分开。然后,您将清除/刷新仅与此帖相关联的缓存。

答案 3 :(得分:0)

简单缓存是指在定义的时间段后超时的缓存。这使缓存层变得简单易行。 Zend Manual has more information on caching basics

然而,实时信息和缓存信息是两个世界。如果您需要实时,请不要缓存。

如果使缓存层过于复杂,则可以销毁整个应用程序。