PHP session_regenerate_id 会话函数

  • 定义和用法

    session_regenerate_id - 使用新生成的会话 ID 更新现有会话 ID
  • 版本支持

    PHP4 PHP5 PHP7
    支持 支持 支持
    7.0.0 session_regenerate_id() 函数在关闭过期会话之前保存其中的数据。
    5.1.0 新加 delete_old_session 参数。
  • 语法

    session_regenerate_id ([ bool $delete_old_session = FALSE ] )
    
    session_regenerate_id() 在不修改当前会话中数据的前提下使用新的 ID 替换原有会话 ID。 如果启用了 session.use_trans_sid 选项, 那么必须在调用 session_regenerate_id() 函数之后开始进行输出工作, 否则会导致使用原有的会话 ID。
    当前的 session_regenerate_id 并没有很好的处理在诸如移动数据网络和 WiFi 网络不稳定的场景。 因此,调用 session_regenerate_id 函数 可能会导致会话丢失。你不应该直接销毁旧的会话所关联的数据, 而是应该使用时间戳机制来控制对于已经失效的会话 ID 的访问。 否则,可能会在并发访问的场景下导致会话数据不一致、 会话丢失等情况,甚至可能引发客户端(浏览器)创建很多无用的会话 ID。 但是,另外一方面来讲,立即删除会话中的数据 可以防止会话劫持攻击。
  • 参数

    参数 必需的 描述
    delete_old_session 是否删除原 ID 所关联的会话存储文件。 如果你需要避免会话并发访问冲突,那么不应该立即删除会话中的数据。 如果你需要防止会话劫持攻击,那么可以立即删除会话数据。
  • 返回值

    成功时返回 TRUE, 或者在失败时返回 FALSE。
  • 示例

    // 注意:下列不是完整的代码,只是一个示例
    
    session_start();
    
    // 检查会话被销毁的时间戳
    if (isset($_SESSION['destroyed'])
       && $_SESSION['destroyed'] < time() - 300) {
       // 通常不会发生这种情况。如果发生,那么可能是由于不稳定的网络状况或者被攻击导致的
       // 移除用户会话中的认证信息
       remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
       throw(new DestroyedSessionAccessException);
    }
    
    $old_sessionid = session_id();
    
    // 设置会话销毁时间戳
    $_SESSION['destroyed'] = time(); // 从 PHP 7.0.0 开始, session_regenerate_id() 会自动保存会话数据
    
    // 如果直接调用 session_regenerate_id() 函数可能会导致会话丢失的情况,
    // 参见下面的例程
    session_regenerate_id();
    
    // 新创建的会话不需要时间戳
    unset($_SESSION['destroyed']);
    
    $new_sessionid = session_id();
    
    echo "Old Session: $old_sessionid<br />";
    echo "New Session: $new_sessionid<br />";
    
    print_r($_SESSION);
    
  • 相关函数

    session_id() - 获取/设置当前会话 ID
    session_create_id() - 新建一个会话 ID
    session_start() - 启动新会话或者重用现有会话
    session_destroy() - 销毁一个会话中的全部数据
    session_reset() - 用原始值重新初始化会话数组
    session_name() - 读取/设置会话名称