当我的 Symfony2 应用程序使用缓存时,什么时候不用?我怎么知道?

When my Symfony2 app is using cache, when not? How do I know?

拥有这个实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="nomencladores.pais", schema="nomencladores")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\PaisRepository")
 * @UniqueEntity(fields={"nombre"}, message="El pais ya existe en nuestra base de datos")
 */
class Pais
{
    use IdentifierAutogeneratedEntityTrait;
    use NamedEntityTrait;
    use ActiveEntityTrait;
}

还有这个存储库:

class PaisRepository extends EntityRepository
{
    public function getPaises()
    {
        $qb = $this->createQueryBuilder('pais');
        $query = $qb->getQuery();
        $query->useResultCache(true, 3600, 'paises_cache');

        return $query->getResult();
    }
}

并在我的控制器上执行此调用:

/**
 * @Route("/paises", name="paises")
 * @Method("GET")
 */
public function getPaisAction()
{
    $em = $this->getDoctrine()->getManager();
    $entities = $em->getRepository('AppBundle:Pais')->getPaises();

    $response['message'] = "";
    $response['entities'] = [];

    if (!$entities) {
        $response['message'] = "No se encontraron países";
    }

    foreach ($entities as $pais) {
        $paises = array();
        $paises['id'] = $pais->getId();
        $paises['text'] = $pais->getNombre();
        $response['entities'][] = $paises;
    }

    return new JsonResponse($response);
}

并且在 config_prod.yml 文件中有这个:

doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver: apc
        query_cache_driver: apc

我如何知道我的应用程序是在使用缓存结果还是一直在进行数据库查询?我正在查看 Symfony2 工具栏(因为我在开发环境中执行测试)并且我一直看到 paises table 的查询,这让我认为没有使用缓存。

我相信你必须告诉 Doctrine 什么时候使用配置的缓存驱动程序,就像这样:

public function getSomeEntities()
{
    $qb = $this->createQueryBuilder('a');

    $qb
        ->where('a.title = "test article"')
        ->orderBy('id', 'ASC')
    ;

    $query = $qb->getQuery();

    $query->useResultCache(true, 60, 'uniqueCacheId');

    return $query->getResult();
}

您还可以指定使用查询缓存:

$query->useQueryCache(true);

您可以在 Doctrine\ORM\Query class documentation 中看到 useQueryCache 函数接受单个布尔参数,而 useResultCache 具有以下参数:

useResultCache( boolean $bool, integer $timeToLive = null, string $resultCacheId = null )