创建独特的会话$ _SESSION' s

时间:2015-08-12 19:24:09

标签: php session

因此,我只是测试会话并了解它们的工作原理。使用下面的代码我会想到我会得到三个不同的结果,但是在我运行它几次之后,最后两个条目是相同的。一些如何将通用会话中的值添加到第二个会话中。第一个看起来没有受到影响。

这里发生了什么?其他人的通用会话可以为我自己添加值吗?有没有办法阻止这种情况发生?

session_unset()仅用于在测试后清除。

代码:

<?php 
    session_id('site');
    session_start();
    $_SESSION['someVal']="yup";
    var_dump($_SESSION);
    // session_unset();
    session_write_close();

    session_id('another');
    session_start();
    $_SESSION['anotherVal']='Another';
    var_dump($_SESSION);
    // session_unset();
    session_write_close();

    session_start();
    $_SESSION['newVal']='newVal';
    var_dump($_SESSION);
    // session_unset();
    session_write_close();
?>

输出:

array (size=1)
  'someVal' => string 'yup' (length=3)
array (size=2)
  'anotherVal' => string 'Another' (length=7)
  'newVal' => string 'newVal' (length=6)
array (size=2)
  'anotherVal' => string 'Another' (length=7)
  'newVal' => string 'newVal' (length=6)

1 个答案:

答案 0 :(得分:1)

首先请注意,会话ID可能不是您认为的。如果为两个不同的用户设置相同的会话ID,他们将共享所有会话数据,通常您希望为每个用户提供不同的会话ID。

然后是因为最后两种情况共享公共会话ID。当您使用session_id()功能时,会话ID会永久设置到脚本末尾或直到下一个session_id()来电。

每个$_SESSION都会填充

session_start()变量,因此详细信息包括:

  1. 您在这里打开一个'site' ID会话。 var_dump将始终输出设置为'someVal'的数组。

    session_id('site');
    session_start();
    
    $_SESSION['someVal']="yup";
    var_dump($_SESSION);
    // session_unset();
    session_write_close();
    
  2. 此处您正在使用'another' ID打开会话。对于第一个请求,var_dump仅输出'anotherVal'

    session_id('another');
    session_start();
    $_SESSION['anotherVal']='Another';
    var_dump($_SESSION);
    // session_unset();
    session_write_close();
    
  3. 最后,您再次打开'another'会话。标识$_SESION的{​​{1}}现在已设置'another''anotherVal',这将在所有后续请求中保持(直到会话数据存在,不会被垃圾收集器删除),在第二种情况下启动'newVal'会话时。

    'another'