在 Symfony2 中使用 APC 的 Doctrine 缓存

Doctrine cache using APC in Symfony2

我正在尝试使用 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 总是 returns false 布尔值。

我检查过 php.ini 文件中是否启用了 APC,而且它在 Symfony 分析器中似乎也已启用。

有什么我可能遗漏的吗?

您的配置看起来不错,结果很可能存储在 APC 缓存中。

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

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

  1. 查看日志文件并检查请求期间 运行 的查询。您应该仅在第一次请求时看到 sql(未填充缓存时)
  2. 尝试在第一次查询后更改数据库中的值 运行。当查询第二次为 运行 时,您应该会看到相同的结果(尽管您进行了编辑)。

还要确保您的缓存驱动程序 (APC) 是针对哪个环境 (devprod) 配置的,因为这可能因不同环境而异(缓存通常在 dev环境)

编辑:我做了一些进一步的研究,现在我确定你的验证方法是错误的。您正在使用的方法 fetch 看起来像:

public function fetch($id)
{
    return $this->doFetch($this->getNamespacedId($id));
}

事实上,您在 useResultCache 方法中使用 favorite 键并不意味着 doctrine 在内部使用此键,因为它是由 getNamespacedId 方法转换的.

勾选fetch method and getNamespacedId method