【发布时间】:2011-04-16 03:36:06
【问题描述】:
我在 Apache 上运行 PHP/Yii 应用程序。我尝试过以下操作:
- 我的 DocumentRoot 是“www”,它是一个符号链接。符号链接指向 /usr/local/src/releases/mysite-1/www
- 我将 /usr/local/src/releases/mysite-1/www 目录重命名为 /usr/local/src/releases/mysite-2/www
- 我使用以下命令删除旧的 www 符号链接:rm -f www
- 我使用以下命令创建一个新符号链接:ln -s /usr/local/src/releases/mysite-2/www www
这样做会导致 PHP 会话被破坏,甚至无需重新启动 Apache。有任何想法吗?我检查了我的 PHP save_path,这应该不是问题,因为我使用 Redis 进行会话处理。我的 Apache 配置如下所示:
DocumentRoot "www"
<Directory "www">
Options -Indexes +FollowSymLinks
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
...
编辑: 我怀疑问题出在 Yii 上。经过一些进一步的测试,看起来会话数据实际上并没有被破坏。我已经切换到基于文件的会话。这是我所看到的:
用户登录,会话 id 设置为 tdv3l6jgf2sb1dnutt7updhfo1
-
会话数据如下:
数组(5){ ["20b30da82f6dcc260a66f6a1044a5c3a_id"]=> 字符串(1) "2" ["20b30da82f6dcc260a66f6a1044a5c3a_name"]=> 字符串(8) "ewest fb" [“20b30da82f6dcc260a66f6a1044a5c3afbId”]=> 字符串(10)“1028251971” [“20b30da82f6dcc260a66f6a1044a5c3aisFbUser”]=>布尔(真) [“20b30da82f6dcc260a66f6a1044a5c3a__states”]=>数组(3){ ["fbId"]=> bool(true) ["isFbUser"]=> bool(true) ["avatar"]=> bool(true) } }
会话文件在/tmp下创建
如上所述,我更改了 www 符号链接。会话 id 保持不变,会话数据完好无损!但是 Yii::app()->user->isGuest 的评估结果为真。所以会话数据仍然存在,但 Yii 认为我已经退出了!
Yii 是否有另一个位置写入用户数据? state.bin 文件位于 www 之外的运行时目录中。
【问题讨论】:
-
乍一看,我不明白这是怎么回事,但是在步骤 2 和 3 之后会话是否仍然出现在 Redis 中?
-
我认为所有这些都与启用 allowAutoLogin 有关。更改符号链接会导致 Yii 使用的 cookie id 丢失。但它不会导致 PHP 会话丢失。
-
对于已经登陆这里的其他人,我们在更改每个构建的文档根目录(而不是使用符号链接)时遇到了类似的丢失会话的问题。原因是
suhosin.session.cryptdocroot标志导致会话加密密钥依赖于 Documentroot 字段