更改符号链接会破坏PHP会话

时间:2011-04-16 03:36:06

标签: php apache yii

我在Apache上运行PHP / Yii应用程序。我尝试过以下操作:

  1. 我的DocumentRoot是“www”,这是一个符号链接。符号链接指向/ usr / local / src / releases / mysite-1 / www
  2. 我将/ usr / local / src / releases / mysite-1 / www目录重命名为/ usr / local / src / releases / mysite-2 / www
  3. 我使用以下命令删除旧的www符号链接:rm -f www
  4. 我使用以下命令创建一个新的符号链接:ln -s / usr / local / src / releases / mysite-2 / www www
  5. 这样做会导致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身上。经过一些进一步的测试后,看起来会话数据实际上并没有被破坏。我已切换到基于文件的会话。这就是我所看到的:

    1. 用户登录,会话ID设置为tdv3l6jgf2sb1dnutt7updhfo1

    2. 会话数据如下:

      array(5){ [ “20b30da82f6dcc260a66f6a1044a5c3a_ ID”] =&GT; string(1)“2” [ “20b30da82f6dcc260a66f6a1044a5c3a _name”] =&GT; string(8)“ewest fb” [ “20b30da82f6dcc260a66f6a1044a5c3afbId”] =&GT; string(10)“1028251971” [ “20b30da82f6dcc260a66f6a1044a5c3aisFbUser”] =&GT;布尔(真) [ “20b30da82f6dcc260a66f6a1044a5c3a__states”] =&GT; array(3){        [ “FBID”] =&GT; bool(true)[“isFbUser”] =&gt; bool(true)[“avatar”] =&gt;布尔(真) } }

    3. 会话文件在/ tmp

    4. 下创建
    5. 我如上所述更改了www符号链接。会话ID保持不变,会话数据完好无损!但是Yii :: app() - &gt; user-&gt; isGuest正在评估为true。所以会话数据仍然存在,但Yii认为我已经退出了!

    6. 是否有其他位置Yii将用户数据写入? state.bin文件位于www。

      之外的运行时目录中

2 个答案:

答案 0 :(得分:2)

我无法弄清楚导致问题的原因,但我确实找到了解决方法。

而不是:

  1. 将www symlink更改为d-xxx,其中xxx是发布版本
  2. 我现在:

    1. 将旧版本目录“d”移至d-yyy,其中yyy是旧版本
    2. 将新版本提取到“d”
    3. “www”符号链接然后仍然指向“d”
    4. 所以“www”符号链接的真实路径永远不会改变。这解决了这个问题,我不知道为什么会这样。除此之外,我手动设置Yii的securityManager的validationKey和encryptionKey。

      我唯一怀疑的是APC和我的设置。

答案 1 :(得分:0)

Yii 1.x中有奇怪的代码: СApplication.php

public function getId()
{
    if($this->_id!==null)
        return $this->_id;
    else
        return $this->_id=sprintf('%x',crc32($this->getBasePath().$this->name));
}

因此,您只需在应用程序配置文件中设置应用程序ID。

例如,protected / config / web.php

return  [
         'id'=>'my application'

...