【问题标题】:Is it better to cache to cache the object in the controller or the query in the method?缓存是在控制器中缓存对象还是在方法中缓存查询更好?
【发布时间】:2012-05-31 18:09:27
【问题描述】:

目前我在基于 mvc 的站点中使用 php 和 apc,这是一个自定义构建的简单 mvc,因此我正在尝试构建它以满足我的需求。

但是我不确定处理缓存的首选位置在哪里?

我有两个选择(我认为).. 要么在各种控制器中进行所有缓存,这意味着对象存储在缓存中,要么将查询返回的数据存储在方法内部的缓存中:

控制器示例:

function showPage() {

    $pageOb = new Page();

    $key = md5('pageOb->getQuery()');

    if(!$data = apc_fetch($key)){

        $data = $pageOb->getQuery();
        apc_add($key, $data, 600);
    }

    require 'template.php';
}   

方法示例:

function getQuery(){

    $sql = "SELECT * FROM table";
    $key = md5('query'.$sql);

    if(!$data = apc_fetch($key)){   

        $core = Connect::getInstance();
        $stmt = $core->dbh->prepare($sql);
        $stmt->execute();
        $data = $stmt->fetchAll();
        apc_add($key, $data, 600);
    }

    return $data;
}

【问题讨论】:

    标签: php model-view-controller caching apc


    【解决方案1】:

    这有点取决于您如何理解和实现模型层。这就是我在服务级别对象中编写缓存相关代码的方式:

    $user = $this->domainObjectFactory->build('User');
    $user->setId(42);
    
    if ( !$this->cacheMapper->fetch('User', $user) )
    {
        $mapper = $this->mapperFactory->build('User');
        $mapper->fetch($user);
    }
    

    如果您不理解术语this comment(跳至“旁注”)可能会有所帮助。再次重复整个过程需要很长时间。

    据我了解,缓存本身只是一种不同的存储形式。因此它只是数据源层的另一部分(映射器、DAO 和类似结构的来源)。

    【讨论】:

    • 谢谢@tereško,正是我想要的!
    【解决方案2】:

    您不应该将数据模型问题冒泡到您的控制器中。这个原理封装在SRP中:http://en.wikipedia.org/wiki/Single_responsibility_principle

    您的第二个解决方案更好,但可以通过进一步抽象从数据源中检索数据来改进它。这是一篇关于该主题的很好的参考文章,尽管使用的语言不同,但模式仍然适用:http://www.alachisoft.com/resources/articles/domain-objects-caching-pattern.html

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 2018-03-09
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多