部署后,Yii memcache会话失效

时间:2013-08-21 04:32:21

标签: php yii

每次部署我的Yii应用程序时,我都会更改/var/www的符号链接。像这样的东西

rm -f /var/www
ln -s /var/app-version /var/www

但每次执行此操作时,用户会话都会失效(即所有用户都已注销并且CSRF令牌已重置)。

对于会话,我使用CCacheHttpSession。类似main.php

中的内容
'components' => [
    'memcache' => [
        'class' => 'CMemCache',
        'servers' => [
            [
                'host' => 'localhost',
                'port' => 11211,
            ]
        ]
    ],
    'user' => [
        'class' => 'WebUser',
        'allowAutoLogin' => true,
    ],
    'session' => [
        'class' => 'CCacheHttpSession',
        'cacheID' => 'memcache'
    ]
]

我不确定这种错误配置是在PHP级还是Yii级,但我做错了什么?

1 个答案:

答案 0 :(得分:8)

默认情况下,CCache会使用包含keyPrefixYii::app()->id。此唯一ID计算为当前basePath加上应用程序name的哈希值。如果您查看setBasePath(),则会看到它将使用realpath()。这会导致符号链接被解析为原点。

因此,如果符号链接的来源发生变化,这将导致不同的应用程序ID,这又会导致更改的缓存键前缀。这会使您的缓存内容无效。

要解决此问题,您可以

  • id配置中的应用程序上设置静态main.php,或
  • keyPrefix组件上设置静态memcache

无论如何,建议使用后者,如果你有多个服务器都应该访问同一个memcached池。