session_start之后的Session :: instance() - Kohana(v.3.2)

时间:2012-12-12 09:17:54

标签: php session exception kohana

我正在使用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

顺便说一下,我正在使用默认的本地会话类。

3 个答案:

答案 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来提供供应商类。 也许不是最优雅的,但它的确有效。 如果你有任何更好的想法,解决方案(我希望如此)我全都耳朵:)