每次我部署我的Yii应用程序时,我都会更改其符号链接/var/www.像这样的东西
rm -f /var/www
ln -s /var/app-version /var/www
Run Code Online (Sandbox Code Playgroud)
但每次执行此操作时,用户会话都会失效(即所有用户都已注销并且CSRF令牌已重置).
对于我使用的会话CCacheHttpSession.像下面的东西main.php
'components' => [
'memcache' => [
'class' => 'CMemCache',
'servers' => [
[
'host' => 'localhost',
'port' => 11211,
]
]
],
'user' => [
'class' => 'WebUser',
'allowAutoLogin' => true,
],
'session' => [
'class' => 'CCacheHttpSession',
'cacheID' => 'memcache'
]
]
Run Code Online (Sandbox Code Playgroud)
我不确定这种错误配置是在PHP级别还是Yii级别,但我做错了什么?
默认情况下CCache将使用keyPrefix包含的Yii::app()->id.此唯一ID值计算为当前basePath加上name应用程序的哈希值.如果你看,setBasePath()你看,它将使用realpath().这会导致符号链接被解析为其原点.
因此,如果符号链接的来源发生变化,这将导致不同的应用程序ID,这又会导致更改的缓存键前缀.这会使您的缓存内容无效.
要解决这个问题,你也可以
id在main.php配置中的应用程序上设置静态,或keyPrefix在memcache组件上设置静态.如果你有多个服务器都应该访问同一个memcached池,那么无论如何都推荐使用后者.