Php Yii memcache会话在部署后无效

Php Yii memcache会话在部署后无效,php,yii,Php,Yii,每次部署Yii应用程序时,我都会更改/var/www的符号链接。类似的东西 rm -f /var/www ln -s /var/app-version /var/www 但每次我这样做时,用户会话都会失效(即,所有用户都注销,CSRF令牌被重置) 对于会话,我使用CCacheHttpSession。在main.php 'components' => [ 'memcache' => [ 'class' => 'CMemCache', 's

每次部署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级别,但我做错了什么?

默认情况下
CCache
将使用包含的。此唯一的
ID
计算为当前
basePath
加上应用程序的
name
的散列。如果你看你看到的,它会使用。这将导致符号链接解析为其原点

因此,如果符号链接的来源发生变化,这将导致不同的应用程序ID,从而再次导致缓存密钥前缀发生变化。这会使缓存内容无效

要解决此问题,您可以

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

不管怎样,如果您有多台服务器,所有服务器都应该访问同一个memcached池,建议使用后者。

因此,
Yii::app()->user->getState()
也受到影响。但是如果我选择后者,我仍然需要为
CWebUser
类定义
stateKeyPrefix
,对吗?是会话的包装器,它添加了一个。默认键前缀也使用Yii应用程序ID。因此,是的,在应用程序上也设置一个静态
ID
可能更安全。有点离题,当我们真的必须更改应用程序
ID
时会发生什么情况?我想没有一般规则。但你遇到的情况肯定是这样。不久前,我在webistrano上遇到了完全相同的问题。很抱歉再次询问,现在用户没有注销,但一些CSRF令牌无效。你也有同样的经历吗?