0%

PHP反序列化session

一般情况下php的session都是序列化成字符串保存的,通过$_SESSION可以直接操作session。

最近有个需求要读取保存在memcache中session字符串。网上找了一圈后发现,PHP似乎没有提供直接反序列化session的函数,只好自己写了一个。

PHP中的session序列化并不是单纯的serialize,而是形如:

1
key1|serialize后的value1;key2|serialize后的value2

因此解析的关键在于使用 ‘|’ 和 ‘;’ 分割数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function parseSession($str){
$sessionData = [];
while(strpos($str, '|')){
$p = strrpos($str, '|');
$v = substr($str, $p+1);
$str = substr($str, 0, $p);

$p = strrpos($str, ';');
if($p){
$k = substr($str, $p+1);
$str = substr($str, 0, $p);
}else{
$k = $str;
$str = '';
}
$sessionData[$k] = unserialize($v);
}
return $sessionData;
}