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