php中將數(shù)據(jù)存儲(chǔ)在session中的時(shí)候,會(huì)根據(jù)配置進(jìn)行序列化刽虹,session_decode函數(shù)可以將session中的數(shù)據(jù)解碼并重新存入$_SESSION這個(gè)全局變量中埠啃。但是如果僅僅需要解碼后的數(shù)據(jù)坐求,不需要重新存儲(chǔ)到session中讼载,就需要自己?jiǎn)为?dú)寫函數(shù)來(lái)進(jìn)行解碼操作,具體代碼如下:
// 請(qǐng)求入口
public function actionIndex($s_id='') {
$session_id = $s_id;
// '37qlrtm2vupsv6vmmi9nlbmdp5';
$data = Yii::app()->session->readSession($session_id);
$session_data = self::unserialize($data);
echo CJSON::encode($session_data);
}
private static function unserialize($session_data) {
$method = ini_get("session.serialize_handler");
switch ($method) {
case "php":
return self::unserialize_php($session_data);
break;
case "php_binary":
return self::unserialize_phpbinary($session_data);
break;
default:
throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
}
}
private static function unserialize_php($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
if (!strstr(substr($session_data, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
}
$pos = strpos($session_data, "|", $offset);
$num = $pos - $offset;
$varname = substr($session_data, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
private static function unserialize_phpbinary($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
$num = ord($session_data[$offset]);
$offset += 1;
$varname = substr($session_data, $offset, $num);
$offset += $num;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}