2016-03-01 54 views
0

我正在寻找一种方式来阅读PHP会话的内容,而实际上并没有取代当前请求的运行会话。阅读PHP会话,而不实际启动它

可以说我有一个正在运行的会话(与在session_start()开始前,使用默认的会话处理程序,并通过PHPSESSID饼干给出的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->阅读似乎并没有工作,要么

$handler = new SessionHandler(); 
var_dump($handler->read($session)); 

//Fatal error: SessionHandler::read(): Cannot call default session handler 

我使用的是原生的php memcached的会话处理程序

谢谢你的任何的窍门!

+0

'SessionHandler'不适用于应用程序 'php_serialize' 工程直接打电话。如果他们想要自定义会话处理,他们应该实现一个子类,然后PHP会调用他们的会话处理程序。 – Barmar

回答

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; 

注意,反序列化($ RAWDATA)

代码只有session.serialize_handler设置为