我正在使用Kohana的Session课程没有问题,但现在我面临一个特殊的情况。
在我的脚本中,我必须加载一个供应商类,某个地方正在调用session_start
。
稍后在代码中我需要调用Session :: instance(),这导致Error reading session data.
异常。
我无法修改供应商代码(具体来说就是facebook php sdk,我不想修改它),我必须稍后调用Session::instance()
。
如何解决这种情况?
你必须知道,这是一个简单的
<?php
session_start();
Session::instance();
?>
会产生相同的异常。 我认为这是Kohana 3.2中的一个错误,但我需要以某种方式欺骗它。
要详细了解Session
课程,请查看以下内容:http://kohanaframework.org/3.2/guide/api/Session
顺便说一下,我正在使用默认的本地会话类。
答案 0 :(得分:5)
正如Alex Mihai指出的,我们可以使用Session :: instance()中的session id参数重新启动它。
您获得的异常是会话仍在运行,您无法恢复正在运行的会话。所以你必须先关闭它。
试试这个:
// Start session
session_start();
// Store session id and close the session
$sessionId = session_id();
session_write_close();
// Then we can restore the session by using the session id
// and the Session class from Kohana
Session::Instance(Session::$default, $sessionId);
它可能也不是最优雅的解决方案,但这对我有用,我希望它能帮到你。
答案 1 :(得分:1)
Kahana doc提到Session :: instance():
某些会话类型(本机,数据库)也支持重新启动a 会话通过传递会话ID作为第二个参数。
也许你可以尝试激情session_id()到Session :: instance()作为第二个参数。
答案 2 :(得分:0)
这是我开始使用的解决方案,但我现在不接受这个解决方案,因为可能更好的解决方案来自其他人。
因此,为了避免这些异常,在不修改Session
类的源代码的情况下,我必须确保会话始终以Session
类开始。
在我的情况下,我只需在Session::instance()
之前调用require
来提供供应商类。
也许不是最优雅的,但它的确有效。
如果你有任何更好的想法,解决方案(我希望如此)我全都耳朵:)