3

我已经按照本文所述设置了我的代码/目录/配置:http ://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

所以我的配置文件看起来像:

<?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'
                )
            )
        )
    ),
);

现在,我需要设置/更改什么以使 Doctrine 使用 Memcached 作为其缓存后端?我在谷歌上搜索了很多,但除了这个问题,它说他们让它工作(但不是如何),我什么也没找到。

4

5 回答 5

8

他们在这里发布了支持它的官方方式

于 2013-05-08T07:00:39.343 回答
6

忘记之前的答案。在花了几个小时跟踪错误后,我发现教义寻找“doctrine.cache.instance”的值应该有一个字符串引用您在服务管理器中设置的服务。

但是,由于原则代码库中的错误,配置永远不会被检索到。稍后我会将其提交给 github。

但好消息是,当没有给出“doctrine.cache.instance”时,会使用别名“my_memcached_alias”。

所以上面的代码可以很容易地修复,并从教义源中删除尴尬的黑客攻击。

注意:为了将来的兼容性和显示设置实例别名的正确方法,我保留了教义缓存配置)

模块.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;
                },
            ),
         ),

我希望您现在已经找到了一个不涉及框架修改的解决方案,但是对于仍在寻找答案的人来说,这肯定会有所帮助

编辑:经过多次头疼后,我发现配置应该是教义.cache.memcache.instance

第二次编辑:

这是正确的代码

'cache' => array(
        'memcache' => array(
            'instance' => 'memcacheService',
        ),
    ),
于 2012-12-03T09:55:20.783 回答
3

我在让它工作时遇到了一些麻烦,我只有一个临时的解决方法,因为我需要修改 Doctrine ORM 模块本身。

首先,在上面的配置中将缓存设置为 memcache 'cache' => 'array',: 'cache' => 'memcache',

然后,定义一个服务工厂来创建 memcache 实例。您可以在模块类中执行此操作:

注意:此示例基于memcache,而不是memcacheD但是对于memcached应该是一样的。

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

最后一步是修改 Doctrine ORM 模块。否则,它不会创建实例并引发错误。

DoctrineModule/Service/CacheFactory.php l61

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

变成:

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

(在您的情况下,对第 64 行执行此操作。)或者找到另一种方法将 memcached 实例注入$options. 请注意,这应该只是一种解决方法并尽快修复。否则,您将无法更新模块。

希望这可以帮助。

于 2012-09-18T07:27:24.447 回答
0

我们不需要更改核心 Doctrine ORM 模块源。

将工厂更改为:

return array(
        'factories' => array(
            'my_memcache_alias' => function(ServiceManager $sm) {
                $memcache = new \Memcache(); // .. do some configuration and connect
                return $memcache;
            } 
        )
    );
于 2014-11-21T19:42:26.313 回答
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 ] ]

之后,我们需要向 config.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/

于 2016-08-28T09:12:16.147 回答