2016-05-12 2 views
1

Я пытался настроить Memcached в DoctrineORM модуле моего проекта ZendFramework 2 выполнять кэширование запросов, результаты и метаданные этого руководства https://github.com/doctrine/DoctrineORMModule/blob/master/docs/cache.md В module.config.phpКак настроить объект как часть кэша второго уровня в DoctrineORMModule?

<?php 

return array(
    'service_manager' => array(
     'invokables' => array(
//   ... 
     ), 
     'factories' => array(
      'doctrine.cache.my_memcached' => function ($sm) { 
       $cache = new \Doctrine\Common\Cache\MemcachedCache(); 
       $memcache = new Memcached(); 
       $memcache->addServer('localhost', 11211); 
       $cache->setMemcached($memcache); 
       return $cache; 
      }, 
      'MemcachedFactory' => \Application\Service\Cache\MemcachedFactory::class, 
     ) 
    ), 
    'doctrine' => array(
     'cache' => array(
      'memcached' => array(
       'namespace' => '_Doctrine', 
       'instance' => 'MemcachedFactory', 
      ), 
     ), 
     'configuration' => array(
      'orm_default' => array(
       'query_cache' => 'memcached', 
       'result_cache' => 'memcached', 
       'metadata_cache' => 'memcached', 
       'hydration_cache' => 'memcached', 
       'second_level_cache' => [ 
        'enabled' => true, 
        'default_lifetime' => 200, 
        'default_lock_lifetime' => 500, 
        'file_lock_region_directory' => './data/cache', 
        'regions' => [ 
         'My\FirstRegion\Name' => [ 
          'lifetime' => 800, 
          'lock_lifetime' => 1000 
         ], 
         'My\SecondRegion\Name' => [ 
          'lifetime' => 10, 
          'lock_lifetime' => 20 
         ], 
        ], 
       ], 
      ), 
     ), 
     'driver' => array(
      '_driver' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'cache' => 'my_memcached', 
       'paths' => array(__DIR__ . '/../src/Application/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        'Application\Entity' => '_driver' 
       ), 
      ), 
     ), 
    ), 
); 

и после того, как создать метод, как следующее:

public function findById($id) { 
    $qb = $this->entityManager->createQueryBuilder(); 
    $qb->select("u") 
      ->from(User::class, "u") 
      ->where($qb->expr()->eq("u.id", ":id")) 
      ->setParameter("id", (int) $id); 

    return $qb->getQuery()->setCacheable(true)->getOneOrNullResult(); 
} 

и после того, как я получаю Doctrine\ORM\Cache\CacheException с сообщением:

Объект «Приложение \ Объект \ Пользователь» не настроен как часть кэша второго уровня.

Любой, кто может предложить мне решить эту проблему?

+0

Пожалуйста, добавьте больше информации о вашей Memcached конфигурации – ceadreak

+0

Выше я добавил информацию о моей Memcached конфигурации –

ответ

0

Добавьте к этому классу USER:

* @ORM\Cache(usage="NONSTRICT_READ_WRITE") 
Смежные вопросы