使用 PHP.net 替代 session_regenerate_id() 时,SESSION 为空[重复]

问题描述 投票:0回答:1

在 php.net 的 session_regenerate_id 手册页上,他们建议不要使用该函数,因为如果有人没有可靠的互联网连接,您可能会遇到问题。我使用他们提出的代码作为替代方案,但遇到了问题。

function regenerateId(): bool {
    // code protecting against logouts due to unstable internet connections 
    // copied from https://www.php.net/manual/en/function.session-regenerate-id.php

    // New session ID is required to set proper session ID
    // when session ID is not set due to unstable network.
    $new_session_id = session_create_id();
    $_SESSION['new_session_id'] = $new_session_id;
    // Set destroy timestamp
    $_SESSION['destroyed'] = time();
        
    // Write and close current session;
    session_commit() ;

    // Start session with new session ID
    ini_set('session.use_strict_mode', 0);
    session_id($new_session_id);
    $result = session_start();
    //ini_set('session.use_strict_mode', 1); // gives error, elsewhere on php.net they removed this from the example
    die('<pre>'.$result.'/'.$new_session_id.'<br>'.print_r($_SESSION,true));
            
    // New session does not need them
    unset($_SESSION['destroyed']);
    unset($_SESSION['new_session_id']);
    // die('regenerated: '. $_SESSION['UID']);
    return $result ;
}

我添加了

die()
语句只是为了确认为什么我在重新生成 id 时总是注销:$_SESSION 数组是空的。

奇怪,因为代码直接来自 php.net(删除了一个错误,请参阅评论)。我被卡住了,又回到原来的

session_regenerate_id()
。我使用的是 PHP 8.1.26

顺便说一句,

session_commit()
session_start()
都返回true。

有谁明白为什么 php.net 代码不起作用并使

$_SESSION
完全为空?和/或如何解决它?

PS。我排除了处理

$_SESSION['destroyed']
的代码,因为它与这个问题无关。它位于 https://www.php.net/manual/en/function.session-regenerate-id.php

php session
1个回答
0
投票

终于在StackOverflow上找到了:php.net上的代码不完整。在正确重新生成会话ID上找到它:

keepSession = $_SESSION ;

// Write and close current session;
session_commit();

// Start session with new session ID
ini_set('session.use_strict_mode', 0);
session_id($new_session_id);
$result = session_start();
$_SESSION = $keepSession 

将这个问题保留在这里是因为我一开始找不到其他问题,我认为我的措辞可能会帮助其他人寻找相同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.