2014-02-14 82 views
1

我已經看到很多類似的溢出問題,但他們都沒有真正解決我的情況,因此我打開這個問題。替代巨大的Codeignitor會話數據

我正在一個項目中有成千上萬的MP3曲目和混音數據庫。每個mp3文件都有一個id和數據庫的相關信息。現在正在構建購物車,用戶可以選擇軌道並添加到購物車。當一個軌道被添加到購物車時,它的ID被存儲在會話中,並且工作正常。

現在問題出現時,會話中存儲了大量ID。會話是一個cookie [codeignitor],我知道它有4kb的存儲空間。

保存這些數據的最佳做法是什麼?我知道我必須改變我的策略並退出使用會議。

我嘗試使用數據庫[MySQL的],它不僅速度慢,但也有一些問題,如每個新用戶需要有一個行添加到數據庫表,如何清除這些表在使用後..等等等等

我試過使用memcached,但我認爲這不是正確的選擇,因爲我試圖存儲的數據並不是那麼大。另外memcached在windows平臺上有幾個問題,前提是我不確定客戶端是否將它部署在Linux/Windows服務器上。

我需要一個本地的跨平臺解決方案。我已經完成了很多研究,並沒有找到可靠的解決方案。

我使用codeignitor框架,因此您可以建議任何PHP或codeignitor解決方案,非常感謝。

+0

是否有某些原因,您不希望將購物車的實際內容存儲在數據庫中,按會話或用戶名進行鍵控,並且只在cookie中攜帶最少的會話信息? –

+0

我瞭解到問題是由Codeignitor會話而不是本機PHP會話引起的。由於Codeignitor會話基本上是一個cookie。它具有cookie的所有限制。 –

回答

0

使用原生的PHP會話是將正確的方式,爲各位用戶只回答了ID上的cookie一個PHP會話商店,但codeignitor行爲不同,它將所有數據存儲到cookie,這是捕獲的地方。

移動到正常的PHP會話是一個痛苦,因爲我必須改變整個項目的代碼。經過一些研究和測試,我得出結論認爲[CI的本地會話庫] [1]

Derek Jones [1]:https://github.com/EllisLab/CodeIgniter/wiki/Native-session是一個很好的替代方案,它使用相同CI會話在CI上使用PHP會話函數和語法。

因此得出結論,無論是從頭開始使用PHP會話還是使用此庫作爲克服CI會話大小限制的替代方案。

0

爲什麼不嘗試setcookie()函數在PHP? 您可以在cookie中存儲所需數量的數據,並將參考的參考存儲在數據庫中!希望你能理解我的答案!

+1

我的問題是具體的,我知道如何設置一個會話。這裏的問題是大量的會話數據。如果您閱讀了更多有關會話的內容,您可以瞭解它只是簡單的Cookie,並且它們有侷限性。 –

+0

哦,很好,明白了你的觀點 –

1

你說的是「在會話中」存儲的東西,所以我假設你使用PHP的會話處理程序,而不是單獨設置cookie。

在這種情況下,會話存儲全部在服務器端完成,所以4k限制不適用。看看你的HTTP標頭的請求時,你只能看到這樣的事情:

Set-Cookie: PHPSESSID=1234abcde56789f 

此會話ID是一個文件(通常存儲在一個目錄,例如/var/lib/php/session/在RHEL發行版),其中包含實際數據作爲序列化的PHP對象。

0

miken32說的是正確的。如果您使用Codeigniter,則設置會話數據庫表並使用codeigniter會話。如果你使用一個數據庫表,然後它只是一個ID設置在cookie。請確保並從官方codeigniter會話數據庫表開始,以便它能正常工作。

codeigniter會話類已內置'垃圾回收'。

這裏所有的解釋,向下滾動數據庫部分: http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

+0

我並不完全同意這種說法,codeignitor會話是一個cookie ..閱讀「什麼是會話數據?」在您提供的鏈接中。因此Codeignitor會話具有cookie的所有限制。當您使用CI會話類時,不僅id和變量都存儲在用戶cookie中。 –

+0

如果您不使用默認的數據庫表,那麼您是正確的。但是如果您使用數據庫表,那麼只有會話ID存儲在cookie中。直接引用:「一旦啓用,Session類將會話數據存儲在數據庫中。」重要 - 除了設置正確的數據庫表之外,您還必須在config/config.php文件中設置會話值。 – cartalot

+0

你錯誤地解釋了這個陳述。然而現實卻遠非如此。通過啓用數據庫,它不僅將會話數據存儲在cookie中,而且還存儲在數據庫中。數據庫的目的僅用於會話驗證。通過加密會話,我爲會話增加了額外的負擔,因爲加密會話的尺寸比正常會話大。雖然我的要求是在CI會話中存儲大量數據。 –