每次部署我的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级,但我做错了什么?
答案 0 :(得分:8)
默认情况下,CCache
会使用包含keyPrefix
的Yii::app()->id
。此唯一ID
计算为当前basePath
加上应用程序name
的哈希值。如果您查看setBasePath()
,则会看到它将使用realpath()
。这会导致符号链接被解析为原点。
因此,如果符号链接的来源发生变化,这将导致不同的应用程序ID,这又会导致更改的缓存键前缀。这会使您的缓存内容无效。
要解决此问题,您可以
id
配置中的应用程序上设置静态main.php
,或keyPrefix
组件上设置静态memcache
。无论如何,建议使用后者,如果你有多个服务器都应该访问同一个memcached池。