更改Session ID并在PHP Zend中保存数据


Change Session ID And Keep Data in PHP Zend

我想改变会话id一旦用户登录到自定义随机会话id与我自己的前缀。

然而,当我做下面的会话数据丢失;

Zend_Session:setId('my-new-id');
Zend_Session:start();

但是如果我执行以下操作,会话数据仍然可用;

Zend_Session:regenerateId();
Zend_Session:start();

我该如何解决这个问题?

参见library/Zend/Session.php:316:

if ( !self::$_sessionStarted ) {
    self::$_regenerateIdState = -1;
} else {
    if (!self::$_unitTestEnabled) {
        session_regenerate_id(true);
    }
    self::$_regenerateIdState = 1;
}

最佳实践是在会话启动后调用它。如果在会话开始之前调用,会话id将在开始时重新生成。

参见:Global Session Management with 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_Session::writeClose()后,我们无法使用Zend_Session::start()版本的22744dd重新启动会话

见此问题:

  • https://github.com/zendframework/zf1/issues/159
  • 修复版本: https://github.com/itscaro/zf1/blob/bbebe445d8551582cba6f5e9c9c1a8396fb2b322/library/Zend/Session.php#L436

无论如何,我建议您查看start session的文档—start a session

and/或使用Zend_Session::regenerateId();而不是Zend_Session::setId()