0

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

2 回答 2

2

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

$user = $this->domainObjectFactory->build('User');
$user->setId(42);

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

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

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

于 2012-05-31T20:07:10.937 回答
1

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

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

于 2012-05-31T18:14:16.480 回答