2012-09-17 2 views
3

Я настроил мой код/​​каталоги/конфигурации, как описано в этой статье: http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/Как использовать Memcached в Doctrine2/ZF2?

Так что мой конфигурационный файл выглядит примерно так:

<?php 
namespace Game; 

return array(

    // <snip> 

    // Doctrine config 
    'doctrine' => array(
     'driver' => array(
      __NAMESPACE__ . '_driver' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'cache' => 'array', 
       'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
       ) 
      ) 
     ) 
    ), 
); 

Теперь, что мне нужно сделать, чтобы установить/изменить, чтобы сделать Учение использует Memcached в качестве кэширующего бэкэнда? Я много искал в Google, но кроме this question, где говорится, что он работает (но не так), я ничего не смог найти.

ответ

3

У меня возникли проблемы с его работой, и у меня есть временное обходное решение, так как мне нужно было модифицировать сам модуль ORM доктрины.

Сначала установите кеш в memcache: 'cache' => 'array', в 'cache' => 'memcache', в вашей конфигурации выше.

Затем укажите фабрику услуг, чтобы создать экземпляр memcache. Вы можете сделать это в классе модуля:

Примечание: Этот пример базы на , кэша памяти не Memcached. Но он должен быть таким же для memcached.

function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'memcache' => function(ServiceManager $sm) { 
       $memcache = new \Memcache(); // .. do some configuration and connect 
       return $memcache; 
      } 
     ) 
    ); 
} 

Последним шагом является изменение модуля ORM доктрины. В противном случае он не создаст экземпляр и не вызовет ошибку.

В DoctrineModule/Service/CacheFactory.php l61:

$cache->setMemcache($options->getInstance()); 

становится:

$cache->setMemcache($sl->get($options->getInstance())); 

(В вашем случае, это сделать для линии 64.) Или найти другой способ, чтобы ввести Memcached экземпляр в $options. Имейте в виду, что это должно быть только обходным путем и должно быть исправлено как можно скорее. В противном случае у вас возникнут проблемы с обновлением модуля.

Надеюсь, это поможет.

6

забыть предыдущий ответ. после траты часов, отслеживающих ошибки, я обнаружил, что доктрина ищет «doctrine.cache.instance» значение должно содержать строку, ссылающуюся на службу, настроенную в диспетчере сервисов.

Однако из-за ошибки в базе кода доктрины config никогда не извлекается. Я передам это github позже.

, но хорошая новость заключается в том, что, когда не указывается «doctrine.cache.instance», используется псевдоним «my_memcached_alias».

поэтому вышеуказанный код можно легко устранить, а неудобные хаки удалены из источника доктрины.

(примечание: я оставил doctrine.cache конфигурации в будущей совместимости и показывает правильный путь, чтобы установить псевдоним экземпляра)

module.config.PHP

'doctrine' => array(
      'driver' => array(
       __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
        'cache' => 'memcached', 
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'), 
       ), 
       'orm_default' => array(
        'drivers' => array(
         __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver', 
        ), 
       ), 
      ), 
      'cache' => array(
       'instance' => 'my_memcached_alias', 
      ), 
     ), 

    'service_manager' => array(
      'factories' => array(
       'my_memcached_alias' => function() { 
        $memcached = new \Memcached(); 
        $memcached->addServer('localhost', 11211); 
        return $memcached; 
       }, 
      ), 
     ), 

я надеюсь, что вы уже нашли решение теперь то не включают рамочную модификацию, но аль людей до сих пор ищут ответы это определенно поможет

Edit: После многих головных болей, которые я нашел что й конфигурация должна быть doctrine.cache.memcache.instance

второго редактирования:

вот правильный код

'cache' => array(
     'memcache' => array(
      'instance' => 'memcacheService', 
     ), 
    ), 
+0

Похоже, что конфигурация «кэш» больше не нужна ? –

8

Они опубликовали официальный способ поддержать это here

+0

Этот ответ более актуальный и не требует взлома модуля ORM доктрины. +1 – bottleboot

0

Нам не нужно, чтобы изменить основной источник модуля Doctrine ORM.

Изменить заводы в:

return array(
     'factories' => array(
      'my_memcache_alias' => function(ServiceManager $sm) { 
       $memcache = new \Memcache(); // .. do some configuration and connect 
       return $memcache; 
      } 
     ) 
    ); 
0

Прежде всего установить Memcached расширение PHP.

~ # > aptitude install php5-memcached 

После этого вам нужно будет настроить Memcached серверов параметры

//app/config/parameters.yml 
parameters: 
    ... 
    memcache_hosts: 
     - 
      dsn: 127.0.0.1 
      port: 11211 

Далее нам нужно создать некоторые услуги

services: 
    memcached: 
     class: Memcached 
     calls: 
      - [ addServers, [%memcache_hosts%] ] 

    doctrine.cache.memcached: 
     class: Doctrine\Common\Cache\MemcachedCache 
     calls: 
      - [ setMemcached, [ @memcached ] ] 

После этого нам нужно будет добавить некоторую конфигурацию конфиг .yml

//app/config/config.yml 

... 
doctrine: 
    ... 
    orm: 
     entity_managers: 
      default: 
       ...  
       metadata_cache_driver: 
        type: service 
        id: doctrine.cache.memcached 
       query_cache_driver: 
        type: service 
        id: doctrine.cache.memcached 
       result_cache_driver: 
        type: service 
        id: doctrine.cache.memcached 

Теперь мы можем использовать Memcached для кэширования наших запросов, как объясняет Doctrine Doc.

Также мы три Symfony команды, чтобы очистить кэш Доктрины

$> php app/console doctrine:cache:clear-metadata 
       //Clears all metadata cache for an entity manager 

$> php app/console doctrine:cache:clear-query 
       //Clears all query cache for an entity manager 

$> doctrine:cache:clear-result 
       //Clears result cache for an entity manager 

Я добыл эти шаги от:

https://blog.42mate.com/implementing-doctrine-caching-with-memcached-in-symfony-2/

 Смежные вопросы

  • Нет связанных вопросов^_^