2

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

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

4

3 回答 3

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);

它也可能不是最优雅的解决方案,但这对我有用,我希望它会对你有所帮助。

于 2012-12-12T15:35:13.987 回答
1

Kahana 文档提到 Session::instance():

某些会话类型(本机、数据库)还支持通过将会话 ID 作为第二个参数传递来重新启动会话。

也许您可以尝试将激情 session_id() 到 Session::instance() 作为第二个参数。

于 2012-12-12T09:42:35.520 回答
0

这是我开始使用的解决方案,但我现在不接受这个分析器,因为也许更好的解决方案会来自其他人。

因此,为避免此类异常,在不修改Session类的源代码的情况下,我必须确保会话始终与Session类一起启动。在我的情况下,我只是调用Session::instance(), 在require供应商类之前。也许不是最优雅的,但它确实有效。如果您有更好的想法,解决方案(我希望如此)我全神贯注:)

于 2012-12-12T09:53:09.877 回答