2

我正在使用 ZF2 I18n 转换器和 memcached。设置是:

use Zend\I18n\Translator\Translator;
use Zend\Cache\Storage\Adapter\MemcachedResourceManager as MemcachedResourceManager;

//=== setup the cache ===//
//create a memcached resource manager
$memcached_resource_manager = new MemcachedResourceManager();
$memcached_resource_manager->addServer( RESOURCE_ID, array( 'localhost', '11211' ));

//create memcached options
$memcached_options = new \Zend\Cache\Storage\Adapter\MemcachedOptions(array(
        'resource_manager' => $memcached_resource_manager,
        'resource_id'      => RESOURCE_ID,
        'namespace'        => CACHE_NAMESPACE,
        'ttl'              => 3600,
        )
    );

//create memcached adapter
$memcached_adapter = new \Zend\Cache\Storage\Adapter\Memcached( $memcached_options );
//== end cache setup ===//

//create translator
$translator = new Translator();
$translator->setCache( $memcached_adapter );

(所有大写的单词都是常数。)

然后我添加带有CsvLoader扩展的自定义类的文件AbstractFileLoader。那部分效果很好。

$translator->addTranslationFile('CsvLoader', $translation_file_name, 'section');

我的问题是当我想清除缓存时。我目前可以通过命名空间一次清除所有语言环境/文件或什么都不清除。如何为缓存中添加的每个翻译文件添加前缀/后缀?

我目前看到像 CACHE_NAMESPACE:Zend_I18n_Translator_Messages_7a1565097c5fca5a3138b2330c2451db

我想看到类似的条目 CACHE_NAMESPACE:Zend_I18n_Translator_Messages_es_MX_7a1565097c5fca5a3138b2330c2451db

显示语言环境。谢谢。

附加信息 要清除条目,我目前正在检索条目:

$entries = $translator->getCache()->getOptions()->getResourceManager()->getResource(self::RESOURCE_ID)->getAllKeys()

(对我来说,这似乎是一个可笑的长函数链 - 欢迎提出更好方法的建议),然后循环检查项目名称。如果一个项目符合一个条件,我打电话removeItem

更新

这是 Bram 提到的哈希生成的相关源代码的链接https://github.com/zendframework/zf2/blob/master/library/Zend/I18n/Translator/Translator.php#L553

4

1 回答 1

1

没有选项可以配置要在缓存键中使用的后缀。您有 2 个选项 imo。

1)扩展Translator类并覆盖loadMessages()方法,根据需要自定义代码。您将不得不复制此方法中的所有代码,这实际上并不可行,并且在 ZF 开发人员更改代码或实施新功能时会导致维护问题。

2)缓存键的建立如下:

$cacheId = 'Zend_I18n_Translator_Messages_' . md5($textDomain . $locale);

为了使区域设置es和文本域的缓存无效,default您可以使用相同的代码自己重建缓存键,并使用缓存适配器删除给定的键。

$memcache_adapter->removeItem('Zend_I18n_Translator_Messages_' . md5('defaultes');
于 2015-04-06T17:03:12.473 回答