使用 cakePHP 2.1,我想编写一个自定义会话处理程序来对 destroy() 和 gc() 执行额外的清理,另外我希望会话持久保存在数据库中。我遵循http://book.cakephp.org/2.0/en/development/sessions.html中的示例,所以我定义了:
class CustomSession extends DatabaseSession implements CakeSessionHandlerInterface { ...
我需要做的额外清理取决于我想从数据库中 cake_sessions 表的数据字段中获取的会话变量。我从cakePHP - 管理数据库 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 函数来反序列化可以工作的数据?