2012-01-05 137 views
4

我需要在會話期間存儲一個大數組(目前達到幾個kB,我將它限制爲0.25MB max)。

在您的意見和實踐中,將它存儲在$ _SESSION或數據庫中會更好嗎?

速度很重要,但處理器/內存使用情況也如此,因爲它在共享主機上,我不希望他們關閉網站以避免資源過度使用。

你會說有一個大小範圍內$ _SESSION可以放心地使用,它會工作得很好嗎? (例如0kb-100kB或任何你的練習/測試顯示)。

謝謝。

+1

我假設使用數據庫肯定會變慢。 250 kb並不是那麼多的數據 – knittl 2012-01-05 12:59:18

回答

4

如果存儲在會話中,具有相同會話數量的0.25MB將比在數據庫中使用更少的資源。因此,會議資源過度使用的可能性較低。

2

這取決於您的網站和服務器的併發用戶數量。既然它是一個共享服務器,我會使用數據庫,如果(並且只有)你有大量的用戶,但使用$ _SESSION更容易和更快,而200kbs不是很多。另外,不使用數據庫可以節省大量時間檢索數據,因爲它不必在每個請求中來回訪問數據庫服務器和Web服務器。

1

當您使用默認的會話處理程序時,會話通常在存儲在文件系統的會話文件中之後加載到內存中。除非您明確使用內存來存儲會話,否則會話中不會存在持久性內存問題。在我看來,無論如何都有很大的會議是不好的。設計中必須有一些根本性的缺陷。如果您想將數據與用戶關聯起來,通常通過設計數據庫來實現,這樣數據就可以通過外鍵與正確的用戶相關聯。您可以查詢此數據的一小部分,而不是將大量數據加載到內存中並對其進行過濾。會話只對用戶身份驗證非常有用。 RESTful API根本不會使用會話。我應該注意到,我偏向於無狀態網絡。會話在請求之間持續存在狀態。我只接受身份驗證作爲有效用例,因爲瀏覽器不提供多功能且安全的替代方案

+0

我對設計評論中的缺陷非常好奇,也許你是對的。我所做的是讓用戶檢查數千個元素進行處理,因此這些元素自然會列在多個頁面中。我需要一種方法來記住用戶在瀏覽頁面時檢查了哪些元素。你認爲這種方法有缺陷嗎?如果是這樣,你會怎麼做?回覆非常感謝。 – CodeVirtuoso 2012-01-05 13:19:55

+1

我傾向於確保每個視圖都是可尋址的。如果您需要保存數據(如選擇),則可以將這些數據保存在客戶端(以隱藏輸入,Json形式或作爲地址的一部分),並在每次請求後發回數據。如果你有很多數據,並且不能依賴JavaScript,我認爲最好的選擇是創建包含用戶綁定字段和會話綁定字段的表,並通過它們的id來訪問這些對象。擁有多個頁面並不意味着您需要在每個頁面上都有數據。 – 2012-01-05 13:38:22

+0

在平均使用情況下,用戶不會重新瀏覽以前的頁面,他們更多時候會繼續瀏覽下一頁。所以基本上你在做的是將部分數據存儲在你的數據庫中,一旦數據完成,讓你的數據庫來操縱它(如果你甚至需要移動它)。但是你不需要重新加載數據來做到這一點,你的數據庫可以爲你操作而不用查詢數據並將其返回給應用程序。我建議的會話標識符就是爲了清理用戶在一段時間後未收回的放棄的會話。 – 2012-01-05 13:41:01

2

會話的真實性能損失是PHP重寫了每個請求的會話數據。寫入磁盤(它將在磁盤上執行)非常緩慢。它只能用於簡單的事情,如認證和小數據結構,例如購物車等。

根據數據類型和服務器上可用的軟件類型,您應該將其存儲在數據庫中,或者您可以使用像MongoDB,Redis或CouchDB這樣的NoSQL解決方案。

由於您首先考慮使用會話,因此我認爲這是因爲數據的一致性不是第一優先級。如果數據很重要,那麼應該使用MySQL數據庫,因爲它遵循ACID原則,並且即使在客戶端與當前會話解除關聯之後也會保留您的數據。

如果一致性不重要,請考慮使用Memcached(如果可用)。

摘要:使用數據庫,但不一定是MySQL(取決於它是什麼數據)。

相關問題