我正在寻找一种方法来读取PHP会话的内容而不实际替换当前请求的运行会话。
假设我有一个正在运行的会话(在使用session_start()之前启动,使用默认会话处理程序和PHPSESSID cookie给出的session_id) 现在我有另一个(有效的)session_id,我想读取该会话中存储的一些数据。
我能想到的唯一方法是用$ oldSession = session_id()替换当前会话,使用session_id($ newId)设置新会话,然后从$ _SESSION读取数据,然后使用session_id重新启动原始会话($ oldSession) - 可能涉及session_commit()和session_start()的一些附加调用。
但我不想触及当前正在运行的会话......
PHP 5.4引入了SessionHandler类(http://php.net/manual/de/class.sessionhandler.php),但手动调用$ SessionHandler-> read似乎无法正常工作
$handler = new SessionHandler();
var_dump($handler->read($session));
//Fatal error: SessionHandler::read(): Cannot call default session handler
我正在使用本机php memcached会话处理程序
感谢任何tipps!
答案 0 :(得分:0)
我通过直接从memcached读取会话数据来解决问题。
基于http://php.net/manual/de/memcached.sessions.php
评论的代码$session = 'session_id_to_read';
$servers = explode(',', ini_get('session.save_path'));
$c = count($servers);
for ($i = 0; $i < $c; ++$i) {
$servers[$i] = explode(':', $servers[$i]);
}
$memcached = new \Memcached();
$memcached->addServers($servers);
$sessionPrefix = ini_get('memcached.sess_prefix');
$rawData = $memcached->get($sessionPrefix.$session);
$data = $rawData ? unserialize($rawData) : false;
请注意,unserialize($ rawData)仅在session.serialize_handler设置为“php_serialize”时才有效