2016-03-14 195 views
1

Symfony2會話有一個令人討厭的問題。我有一輛車可以插入東西。我補充幾個項目和它的作品,但在某些項目的應用程序崩潰,告訴我 ContextErrorException: Warning: session_start(): Failed to decode session object. Session has been destroyed in ... 會話被破壞,我登錄了該網站。
我將會話存儲在數據庫中,關於會話的行也被刪除,就像乾淨的註銷一樣。 我三重檢查了所有的代碼,我沒有使我的會話失效的代碼。我也註釋了包含session->invalidate的每行都無濟於事。
我注意到,會話清理自帶的一個功能「返回」,並在代碼返回後,我下面的代碼行之間,但他們之間沒有任何代碼。這似乎與事件/聽衆有關,但沒有一個是由我配置的。
我不知道在哪裏檢查,有什麼想法?Symfony 2會話被破壞

回答

1

基於this report和其他搜索,我的猜測是,你是在爲你的會話數據存儲多字節字符串,它變得損壞。數據庫列存儲數據的時間太短,字符串也會被截斷,導致數據庫被破壞。下面是我會看到的:

  • 如果您使用數據庫進行存儲,請確保它已準備好用於多字節字符串。
  • 確保您的會話數據庫列足夠大,例如MEDIUMTEXT而不是VARCHAR
  • 也許有在Symfony的會話處理程序中的錯誤(因爲這很可能會被迅速引起不太可能)。
  • 也許你已經以某種方式破壞了你自己的多字節字符串。檢查你沒有使用任何不是二進制安全的PHP函數。

如果找不到根本原因,我會嘗試覆蓋會話存儲處理程序,並在檢索後存儲和解碼之前對數據運行base64_encode。但這是解決真正問題的最後手段。

+0

我使用會話存儲以及在symfony的類Save方法的第一個指令PDO是'''bas64_encode'''。 奇怪的是,只有購物車中的某些物體組合會產生錯誤信息。 –

+1

準確地說:在會話中存儲序列化的應用程序對象,當所有工作正常時,我可以base64解碼數據庫中的會話內容並查看所有序列化的對象。事實上,如果我手動破壞數據庫中的數據,我會得到相同的錯誤。 –

+0

有趣。你當然仔細研究過它。你有沒有嘗試手動反序列化這些對象?也許字符串是安全的,但是反序列化失敗。另外,序列化的對象是否對於分列大小來說太長? –

0

我改變了PDOSessionHandler的write e讀取方法,而不是base64encode/decode我把utf8_encode寫入,並在讀取方法我把utf8_decode。此解決方法適用於我,但不是一個乾淨的解決方案。現在的問題是:爲什麼base64encode/decode失敗?