阅读PHP Session而不实际启动它

时间:2016-03-01 16:41:47

标签: php session

我正在寻找一种方法来读取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!

1 个答案:

答案 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”时才有效