如何取消对PHP SESSION序列化值的序列化


How to unserialise the PHP SESSION serialised value?

我在DynamoDB中存储了一个PHP SESSION值,下面的序列化结构是使用SESSION_set_save_handler()从on_SESSION_write()函数中获得的,

id|s:26:"rj4n98n6371vpgj8h5s10lmoh2";matt|N;SmartyValidate|a:1:{s:7:"default";a:4:{s:16:"registered_funcs";a:2:{s:8:"criteria";a:0:{}s:9:"transform";a:0:{}}s:10:"validators";a:0:{}s:8:"is_error";b:0;s:7:"is_init";b:1;}}language_id|i:1;language|s:3:"eng";

我尝试了PHP serialize()和unserialize(。那么,我怎样才能取消序列化这个值呢?

我需要根据$_SESSION打印值的输出格式。

文档介绍了session_set_save_handler:

虽然数据看起来与serialize()相似,但请注意,它是session.serialize_handler ini设置中指定的不同格式。

设置session.serialize_handler默认为php,这意味着PHP使用内部session_encode()session_decode()函数。

session_decode()$data中提供的序列化会话数据进行解码,并用结果填充$_SESSION超全局。

示例:

<?php
session_start();
$str = 'id|s:26:"rj4n98n6371vpgj8h5s10lmoh2";matt|N;SmartyValidate|a:1:{s:7:"default";a:4:{s:16:"registered_funcs";a:2:{s:8:"criteria";a:0:{}s:9:"transform";a:0:{}}s:10:"validators";a:0:{}s:8:"is_error";b:0;s:7:"is_init";b:1;}}language_id|i:1;language|s:3:"eng";';
if (session_decode($str)) {
  print_r($_SESSION);
} else {
  die ("failed to decode session");
}

注意:您需要使用session_start()初始化一个虚拟会话。否则,session_decode()失败并且不填充$_SESSION阵列。

$data = unserialize($value);
print_r($data);