使用cakePHP 2.1,我想编写一个自定义会话处理程序来对destroy()和gc()执行额外的清理,此外我希望会话在数据库中持久化。我正在关注http://book.cakephp.org/2.0/en/development/sessions.html中的示例,所以我定义了:
class CustomSession extends DatabaseSession implements CakeSessionHandlerInterface { ...
我需要做的额外清理取决于我想从数据库中的cake_sessions表的数据字段中获取的会话变量。我从cakePHP - Managing a database CakeSessions了解到这个数据是PHP serial()函数的结果,我可以使用unserial()来获取先前序列化数据的对象。但是,对cake_sessions中的数据使用unserial()始终会导致:
Notice: unserialize() [function.unserialize]: Error at offset 0 of 159 byte
在cakePHP之外,我写了以下内容
$query = "SELECT * FROM testdb.cake_sessions WHERE id = 'b5d4vc0143ruh420hmkvl7s722'";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
echo '<pre>' . print_r($row['data']) . '</pre>';
$session_vars = unserialize($row['data']);
echo '<pre>' . $session_vars . '</pre>';
上面打印了cake_sessions表中的序列化数据字段,但由于前面描述的错误而不打印未序列化的对象。一些论坛帖子提到这是一个MySQL问题,并使用blob而不是text作为数据字段的类型,但这没有任何区别。
从cake_sessions获得的数据字段的测试示例是:
Config|a:3{s:9:"userAgent";s:32:"d7e7d243e8bfaf713b70bde2a6ef1c18";s:4:"time";i:1341540422;s:9:"countdown";i:10;}Customer|a:2:{s:4:"cart";i:1;s:4:"test";i:2;}
序列化的含义是显而易见的,所以我可以手工解析它,但我不愿意。
为什么unserial()不工作和/或是否有现有的PHP函数来反序列化有效的数据?