2012-12-12 42 views
2

我正在使用Kohana的Session類沒有問題,但現在我正面臨特殊情況。 在我的腳本中,我必須加載供應商類,其中某個地方正在調用session_startSession :: instance()session_start之後 - Kohana(v.3.2)

後來在代碼中,我需要調用Session :: instance(),這導致了Error reading session data.異常。

我不能修改供應商代碼(只是要具體它是Facebook的PHP SDK,我不想修改它),我不得不稍後調用Session::instance()

如何解決這種情況?

你要知道,一個簡單的

<?php 
session_start(); 
Session::instance(); 
?> 

會產生相同的異常。 我認爲這是Kohana 3.2中的一個錯誤,但我需要用某種方式欺騙它。順便說一句http://kohanaframework.org/3.2/guide/api/Session

,我使用的是默認的,本地會話類:

要了解更多關於Session類,檢查了這一點。

回答

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

它也可能不是最完美的解決方案,但這個工作對我來說,我希望它會幫助你。

+0

謝謝你的回答。說實話,我認爲不存在「更好」的解決方案,這是一個很好的解決方法。 –

+0

完美的一個..明白了! – jeeva

1

的卡納文檔中提到的會議::實例():

一些會話類型(本地數據庫)也支持通過傳遞會話ID作爲第二個參數重啓 會話。

也許你可以嘗試激情session_id()Session :: instance()作爲第二個參數。

+0

好主意。這是我第一次試圖解決這個問題的嘗試之一,但可悲的是它不起作用。 'session_start(); Session :: instance(Session :: $ default,session_id());'產生相同的異常。 –

0

下面是我開始使用的解決方案,但我現在不接受這個解決方案,因爲也許更好的解決方案將來自其他解決方案。

因此,爲了避免這些異常,在不修改Session類的源代碼的情況下,我必須確保該會話總是以Session類開始。 在我的情況下,我只需撥打Session::instance(),之後require-供應商類別。 也許不是最優雅的,但它的工作原理。 如果你有什麼更好的主意,解決方案(我希望如此)我都是耳朵:)