[英]How to use Memcached in Doctrine2 / ZF2?
我已经设置了本文中概述的代码/目录/配置: 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作为其缓存后端? 我在谷歌上搜索了很多,但除了这个问题 ,它说它让它工作(但不是如何),我一直无法找到任何东西。
他们张贴了官方的方式来支持它在这里
忘记以前的答案。 在花费数小时跟踪错误后,我发现doctrine查找“doctrine.cache.instance”值,应该有一个引用您在服务管理器中设置的服务的字符串。
但是,由于教条代码库中的错误,从不检索配置。 我稍后会将此提交给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;
},
),
),
我希望你现在已经找到了一个解决方案,它不涉及框架修改,但是对于那些仍在寻找答案的人来说,这肯定会有所帮助
编辑:经过多次头痛我发现配置应该是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;
}
)
);
}
最后一步是修改Doctrine ORM模块。 否则,它将不会创建实例并抛出错误。
在DoctrineModule/Service/CacheFactory.php l61
: DoctrineModule/Service/CacheFactory.php l61
:
$cache->setMemcache($options->getInstance());
变为:
$cache->setMemcache($sl->get($options->getInstance()));
(在你的情况下,为第64行执行此操作。)或者找到另一种方法将memcached实例注入$options
。 请注意,这应该只是一种解决方法,并尽快修复。 否则,您将无法更新模块。
希望这可以帮助。
我们不需要更改核心Doctrine 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: 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命令来清除doctrine缓存
$> 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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.