【问题标题】:Zend how to use cache componentZend如何使用缓存组件
【发布时间】:2011-09-09 23:00:57
【问题描述】:

假设您有这样的场景:一个简单的博客主页,它同时加载静态内容和动态内容。 静态内容由很少更改的图像组成。我也有数据库驱动的动态内容。动态内容包含您所有的博客文章(文本和图像)和相关用户 cmets。动态内容从每小时到每天。

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

感谢您的耐心等待。

卢卡

再次感谢

【问题讨论】:

    标签: php zend-framework cache-control


    【解决方案1】:

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

    基本上,你需要做的是设置一个缓存机制,然后当你想从缓存中检索某些东西时手动调用它。

    在引导程序中,我可能有以下代码:

    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');
    

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

    【讨论】:

      【解决方案2】:

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

      首先通过在引导文件中创建函数来初始化引导文件中的fronted和backed。

      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缓存工厂来定义缓存对象。参数core定义了泛型类型的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);
      }
      

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

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

      您可以根据定义的路径检查文件。

      该文件中的数据是 json 格式。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          简单缓存是在定义的时间段后超时的缓存。这使缓存层保持简单且易于实现。 Zend Manual has more information on caching basics

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

          如果缓存层过于复杂,可能会破坏整个应用程序。

          【讨论】:

            猜你喜欢
            • 2013-06-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-29
            • 1970-01-01
            • 2016-05-11
            • 1970-01-01
            • 2021-08-14
            相关资源
            最近更新 更多