缓存以缓存控制器中的对象或方法中的查询是否更好?

时间:2012-05-31 18:09:27

标签: php model-view-controller caching apc

目前我在基于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;
}

2 个答案:

答案 0 :(得分:2)

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

$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和类似结构来自)。

答案 1 :(得分:1)

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

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