如何在Doctrine2/ZF2中使用Memcached



我已经按照本文所述设置了我的代码/目录/配置: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' => 'DoctrineORMMappingDriverAnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'
)
)
)
),
);

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

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

忘记前面的答案。花了几个小时追踪错误后,我发现doctrine会查找"doctrine.cache.instance"值,该值应该有一个字符串引用您在服务管理器中设置的服务。

然而,由于条令代码库中的一个错误,从未检索到配置。我稍后会把这个提交给github。

但好消息是,当没有给定"doctory.cache.instance"时,将使用别名"mymemcached_alias"。

因此,上述代码可以很容易地修复,并从条令来源中删除尴尬的黑客行为。

(注意:为了将来的兼容性,我保留了doctrine.cache配置,并显示了设置实例别名的正确方法)

module.config.php

'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'DoctrineORMMappingDriverAnnotationDriver',
'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;
},
),
),

我希望你现在已经找到了一个不涉及框架修改的解决方案,但对于所有仍在寻找答案的人来说,这将毫无疑问地帮助

编辑:在经历了许多麻烦之后,我发现配置应该是doctrine.cache.memcache.instance

第二次编辑:

这是正确的代码

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

我在让它工作时遇到了一些困难,我只有一个临时的解决方法,因为我需要修改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;
} 
)
);
}

最后一步是修改条令ORM模块。否则,它将不会创建实例并抛出错误。

DoctrineModule/Service/CacheFactory.php l61:中

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

成为:

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

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

希望这能有所帮助。

我们不需要更改核心条令ORM模块源代码。

将工厂更改为:

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

首先安装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: DoctrineCommonCacheMemcachedCache
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/

相关内容

  • 没有找到相关文章

最新更新