2016-03-01 53 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設置爲