gpt4 book ai didi

php/mongodb session 管理器,session_set_save_handler() 问题

转载 作者:可可西里 更新时间:2023-11-01 10:34:35 26 4
gpt4 key购买 nike

我正在使用一个 PHP session 管理器类来处理 MongoDB 中的用户 session ,但它不起作用,而且我终究无法弄清楚原因。 session 变量设置成功,但不会持久化到其他页面。与 MongoDB 的连接不是问题。我确定问题与 session_set_save_handler 有关,因为如果我注释掉该函数, native PHP session 处理工作正常。

预先感谢您的帮助。

...
require('database.class.php');

class SessionManager {

const COLLECTION = 'sessions';
const SESSION_TIMEOUT = 600;
const SESSION_LIFESPAN = 3600;
const SESSION_NAME = 'mongosessid';
const SESSION_COOKIE_PATH = '/';
const SESSION_COOKIE_DOMAIN = '';

private $_mongo;
private $_collection;
private $_currentSession;

public function __construct() {
$this->_mongo = DBConnection::instantiate();
$this->_collection = $this->_mongo->getCollection(SessionManager::COLLECTION);

register_shutdown_function('session_write_close');

session_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc')
);

//Set session garbage collection period
ini_set('session.gc_maxlifetime', SessionManager::SESSION_LIFESPAN);

//Set session cookie config
session_set_cookie_params(
SessionManager::SESSION_LIFESPAN,
SessionManager::SESSION_COOKIE_PATH,
SessionManager::SESSION_COOKIE_DOMAIN
);

//Replace 'PHPSESSID' with 'mongosessid' as the session name
session_name(SessionManager::SESSION_NAME);
session_cache_limiter('nocache');

session_start();

}

public function open($path, $name) {
return true;
}

public function close() {
return true;
}

public function read($sessionId) {
$query = array('session_id' => $sessionId,
'timedout_at' => array('$gte' => time()),
'expired_at' => array('$gte' => time() - SessionManager::SESSION_LIFESPAN)
);

$result = $this->_collection->findOne($query);
$this->_currentSession = $result;

if (!isset($result['data'])) {
return '';
}

return $result['data'];
}

public function write($sessionId, $data) {
$expired_at = time() + self::SESSION_TIMEOUT;
$new_obj = array('data' => $data,
'timedout_at' => time() + SessionManager::SESSION_TIMEOUT,
'expired_at' => (empty($this->_currentSession)) ? time() + SessionManager::SESSION_LIFESPAN : $this->_currentSession['expired_at']
);
$query = array('session_id' => $sessionId);

$this->_collection->update($query,
array('$set' => $new_obj),
array('$upsert' => TRUE)
);
}

public function destroy($sessionId) {
$this->_collection->remove(array('session_id' => $sessionId));
return TRUE;
}

public function gc() {
$query = array('expired_at' => array('$lt' => time()));
$this->_collection->remove($query);
return TRUE;
}

}

$session = new SessionManager();

?>

最佳答案

write 在对象销毁后调用。您的 $_mongo 对象在您使用它时已经被销毁。

使用session_write_close()register_shutdown_function()来解决这个问题。

register_shutdown_function('session_write_close');

除此之外(因为这几乎肯定会发生),更新查询的选项不以 $ 开头(我自己犯了很多次这个错误),你需要 upsert 不是 $upsert

关于php/mongodb session 管理器,session_set_save_handler() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10914933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com