在Symfony2中使用APC的Doctrine缓存

时间:2015-09-01 16:39:20

标签: symfony caching doctrine-orm doctrine

我尝试使用doctrine缓存来保存查询的数据结果。

我已使用以下缓存配置选项更新了配置文件中的学说信息:

orm:
    ...
    metadata_cache_driver: apc
    query_cache_driver: apc
    result_cache_driver: apc

以下是我应用结果缓存的查询示例:

    $query = $this->repository->createQueryBuilder('fp')
        ->where('fp.userId = :userId')
        ->setParameter('userId', $userId)
        ->getQuery()
        ->useResultCache(true, 3600, 'favorite');

    return $query->getResult();

它可以无错误地检索数据,但似乎并没有将结果存储在APC缓存中。

我尝试以下代码以检查查询结果是否已缓存在APC中:

    $q = new \Doctrine\Common\Cache\ApcCache();
    $data = $q->fetch('favorite');

但是data始终返回false布尔值。

我已经检查过php.ini文件中是否启用了APC,并且它在Symfony探查器中显示为启用。

我可能遗失的任何东西?

1 个答案:

答案 0 :(得分:4)

您的配置似乎很好,结果很可能存储在APC缓存中。

方法useResultCacheDoctrine执行查询的方式工作,并在第一次运行查询时将结果存储在缓存中。之后(在timeout集内)数据库未查询结果,它将直接从缓存中获取。

我认为这里的一个真正问题是您验证结果是否存储在APC缓存中的方式。我会建议其他(更可靠)的方法来检查它:

  1. 查看日志文件并检查在请求期间运行的查询。你应该只看第一个请求的sql(当没有填充缓存时)
  2. 尝试在第一次查询运行后更改数据库中的值。第二次运行查询时,您应该看到相同的结果(尽管您进行了编辑)。
  3. 还要确保配置缓存驱动程序(dev)的环境(prodAPC),因为这可能因各种环境而异(缓存通常在{{1}中禁用环境)

    编辑:我做了一些进一步的研究,现在我确定您的验证方法是错误的。您正在使用的方法dev如下:

    fetch

    因此,您在public function fetch($id) { return $this->doFetch($this->getNamespacedId($id)); } 方法中使用favorite密钥并不意味着useResultCache在内部使用此密钥,因为它是由doctrine方法转换的。< / p>

    检查fetch methodgetNamespacedId method