APC缓存适配器 - 独一无二?

时间:2013-01-20 15:12:29

标签: zend-framework2

也许我现在还没有完全理解文档,但有没有办法设置一个唯一的标识符,以便我的缓存翻译不会被覆盖?

每个域都有相同的命名空间。

以下是我目前在module.config.php

中的内容
'translator' => array(
    'locale'                    => 'en',
    'translation_file_patterns' => array(
        array(
            'type'        => 'gettext',
            'base_dir'    => __DIR__ . '/../language',
            'pattern'     => '%s.mo',
            'text_domain' => 'ftp'
        )
    ),
    'cache' => \Zend\Cache\StorageFactory::factory(array(
        'adapter' => 'apc',
        'plugins' => array(
            'exception_handler' => array(
                'throw_exceptions' => false
            )
        )
    ))
)

现在我在同一台机器上运行两个Apache VirtualHosts,在每个VirtualHost中我有一个名为Ftp的模块,每个模块都使用ftp text_domain来翻译自己的翻译。

假设我有一个名为translate_this_text的翻译密钥,该密钥用于两个域。

在domain1.com上,它会读取,Test1 在domain2.com上它会读,Test2

如果我访问domain1.com,则文本将转换为Test1 如果我访问domain2.com,文本将被转换为Test1,但这应该是Test2

如果我清除APC缓存并访问domain2.com,则翻译显示Test2,但如果我访问domain1.com则显示Test2。

我希望这不会太混乱。

所以最后,有没有办法在每个主机上设置某种类型的唯一标识符,因此它们不会互相覆盖,因为它们现在存在于同一台机器上?

1 个答案:

答案 0 :(得分:2)

用数组替换adapter值,以便将选项注入APC适配器:

'translator' => array(
    'cache' => \Zend\Cache\StorageFactory::factory(array(
        'adapter' => array(
            'name'    => 'apc',
            'options' => array(
                'namespace' => 'foo_bar',
            ),
        ),
        'plugins' => array(
            'exception_handler' => array(
                'throw_exceptions' => false
            )
        )
    ))
)

我会在您的全局文件中编写上面的配置没有 namespace密钥,然后在config.local.php添加此规则:

$cache_namespace = 'foo_bar';

'translator' => array(
    'cache' => \Zend\Cache\StorageFactory::factory(array(
        'adapter' => array(
            'options' => array(
                'namespace' => $cache_namespace,
            ),
        ),
    ))
)

对于每个应用程序,您只需编辑本地配置文件并共享全局缓存选项。