我正在研究缓存以及如何在Doctrine中使用它。
我的Zend Framework Bootstrap.php中有以下内容:
// Build Configuration
$orm_config = new \Doctrine\ORM\Configuration();
// Caching
$cacheOptions = $options['cache']['backendOptions'];
$cache = new \Doctrine\Common\Cache\MemcacheCache();
$memcache = new Memcache;
$memcache->connect($cacheOptions['servers']['host'], $cacheOptions['servers']['port']);
$cache->setMemcache($memcache);
$orm_config->setMetadataCacheImpl($cache);
$orm_config->setQueryCacheImpl($cache);
$orm_config->setResultCacheImpl($cache);
我正在使用以下命令在我的数据库上运行一个非常简单的查询:
self::_instance()->_em->getRepository('UserManagement\Users')->find('1');
而且我不确定我是否正确使用缓存,因为有了它(如 根据上面的配置,查询似乎需要两倍的执行时间 和它一样禁用,这是对的吗?
提前致谢, 史蒂夫
答案 0 :(得分:4)
我似乎自己对此进行了排序,与enter link description here有关。基本上,据我所知,存储库查询如:
self::_instance()->_em->getRepository('UserManagement\Users')->find('1');
不会缓存结果。如果在整个脚本处理过程中再次执行相同的查询,它将不执行搜索并使用它在内存中的结果 - 这与真正的缓存不同,在我的情况下使用Memcache。
实现此目的的唯一方法是使用以下内容覆盖自定义存储库中的Doctrine EntityRepository find()方法:
public function find($id)
{
// Retrieve an instance of the Entity Manager
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('u')
->from('UserManagement\Users', 'u')
->where('u.id = :id')
->setParameter('id', $id);
$query = $qb->getQuery();
$query->useResultCache(TRUE);
$result = $query->getSingleResult();
return $result;
}
值得注意的是,上面最重要的一行是$query->useResultCache(TRUE);
- 这会通知应用程序缓存结果。
希望这有帮助。