更改会话ID并将数据保存在PHP Zend中

更改会话ID并将数据保存在PHP Zend中,php,session,zend-framework,session-variables,Php,Session,Zend Framework,Session Variables,我想在用户登录到带有我自己前缀的自定义随机会话id后更改会话id 但是,当我执行以下操作时,会话数据丢失 Zend_Session:setId('my-new-id'); Zend_Session:start(); 但是,如果我执行以下操作,会话数据仍然可用 Zend_Session:regenerateId(); Zend_Session:start(); 知道如何解决此问题吗?请参见: 最佳做法是在会话启动后调用此函数。如果在会话启动之前调用,会话id将在启动时重新生成 另请参见:对于Z

我想在用户登录到带有我自己前缀的自定义随机会话id后更改会话id

但是,当我执行以下操作时,会话数据丢失

Zend_Session:setId('my-new-id');
Zend_Session:start();
但是,如果我执行以下操作,会话数据仍然可用

Zend_Session:regenerateId();
Zend_Session:start();
知道如何解决此问题吗?

请参见:

最佳做法是在会话启动后调用此函数。如果在会话启动之前调用,会话id将在启动时重新生成

另请参见:对于ZF1:

$defaultNamespace = new Zend_Session_Namespace();
if (!isset($defaultNamespace->initialized)) {
    Zend_Session::regenerateId();
    $defaultNamespace->initialized = true;
}
添加:

然后试试这个:

$commit = Zend_Session::namespaceGet('Default');
Zend_Session::writeClose(false);
// ^ session_commit(); // see Advanced Usage: http://framework.zend.com/manual/1.12/en/zend.session.advanced_usage.html#zend.session.advanced_usage.starting_a_session

.. change id with session_id("my-new-id");

// start new session ... 
$namespace = new Zend_Session_Namespace('Default');
foreach($commit as $idx => $data){
    $namespace->$idx = $data;
}
然而调用Zend_会话::writeClose()后,无法使用的Zend_会话::start()版本重新启动会话

见本期:

  • 固定版本
无论如何,我建议看一下启动会话的文档-


和/或使用Zend_会话::RegeneratID();与Zend_会话::setId()

相比,它仍然没有多大帮助,因为我希望生成一个带有预定义前缀的会话id,例如myprefix-**********************详细信息仍然丢失:(奇怪-\-使用最新的变体应该可以,因为Zend_会话:setId()包装的会话id($id);所有丢失数据的问题都应该得到修复/使用$commit您应该已经从Zend_会话_名称空间(“默认”)复制了所有数据…需要更多代码的详细信息因此,当我转到Zend_会话::名称空间获取(“默认”);除了新的Zend_会话_名称空间(“默认”)之外,我没有得到任何数据;这是可行的。但是,当出于某种原因使用“2件事”选项时,不会应用新的会话数据。namespaceGet仅检索会话名称空间的所有数据。“Default”默认为名称(请参阅文档)。更改id之前在何处以及如何分配会话数据?请检查-
$commit = Zend_Session::namespaceGet('Default');
Zend_Session::writeClose(false);
// ^ session_commit(); // see Advanced Usage: http://framework.zend.com/manual/1.12/en/zend.session.advanced_usage.html#zend.session.advanced_usage.starting_a_session

.. change id with session_id("my-new-id");

// start new session ... 
$namespace = new Zend_Session_Namespace('Default');
foreach($commit as $idx => $data){
    $namespace->$idx = $data;
}