2011-01-31 133 views
2

這是一個初學者的問題...PHP - 我們應該在會話中包含哪些數據?

在一個網站,什麼類型的數據應該或不應該包括在會議內?我知道我不應該包含任何需要保持安全的信息。我對編程最佳實踐更感興趣。例如,可以在會話中包含一些數據,否則這些數據將作爲依賴注入從頁面到頁面發送。這不對應於創建一個全局變量嗎?

一般來說,什麼樣的數據已經或沒有它的會話表內的地方嗎?

謝謝,

JDelage

+0

難道你沒有看到你的問題太廣泛了,沒有「最佳實踐」的答案嗎? – 2011-01-31 13:53:15

回答

1

你應該把你的會話作爲,多次讀取存儲。但是一個非常不穩定 - 例如如果所有會話突然消失,則基礎應用程序數據的狀態應該一致(或可恢復)。

有一些例外情況(通常是購物籃將被存儲在會話 - 但你可能要進行庫存調整到之前結賬「儲備」項目)。這裏的項目可能會多次添加/編輯/更改 - 因此它不是真的只寫一次 - 而是通過預留庫存項目來維護數據庫的可恢復性 - 但這意味着您應該撤銷庫存調整當會議在沒有完成時到期

如果你開始嘗試存儲有關涉及個人頁面的數據信息轉彎,你很快要進入的問題,當用戶開始點擊前進/後退按鈕或打開一個新窗口。

7

保持請求之間所需的狀態信息所需要的信息的最小量。

+0

我通常放置在UID,用於CSRF的Hashes,驗證碼值等。+1 – RobertPitt 2011-01-31 13:31:27

+0

@RobertPitt - 什麼是CSRF? Thx – JDelage 2011-02-02 08:44:51

1

一般而言,您可以在會話中放入任何您喜歡的東西。將信息放入必須呈現的會話中以使您的頁面在沒有(技術)錯誤的情況下運行是不好的做法。

我建議的數據量儘可能最小化會話。

1

的東西,你可以在會話,這樣,你沒有做出這是不會改變的信息另一個數據庫查詢保存。像他們的用戶名,地址,電話號碼,賬戶餘額,在您的網站的安全權限等

1

(這也許比你要找的,但可能使良好的附加信息添加到很好的答案已經發布。)

既然你提到的最佳實踐,你可能要考慮一些項目/技術可以用來把會話狀態的想法遠一點。跨多個服務器水平擴展Web應用程序的一個常見錯誤是維護它們之間的會話狀態。 (用戶A登錄到存儲用戶會話的服務器A,但在下一個請求命中服務器B時,它不知道用戶A的會話等)

我總是最終對自己說的一件事而對於同事來說,即使數據本質上是短暫的,數據本身並不是真正存儲數據的最佳位置。 Web服務器是一個請求/響應系統,而不是數據存儲。它非常適合前者,但對於後者來說並不總是如此之好。

因此,有些方法可以將您的應用程序的會話數據(或任何有狀態的數據,從Web服務器到另一個系統實際上保持在RESTful無狀態特性中的設計最小值)。 Memcached是一個非常常見的工具。還有一些嵌入式會話替換(或各種框架/環境的可配置會話選項),它們將會話存儲在數據庫(如SQL或MySQL)中。

一個想法我最近一直在玩弄是存儲會話數據(當然,它是確定任何瞬態數據失去它在災難)中的NoSQL數據庫。 CouchDBMongoDB是我目前的首選,但並不缺乏其他選擇。 CouchDB具有出色的橫向擴展性,MongoDB在內存完全運行時速度很快,等等。

至少對我而言,這樣的一個主要好處是部署很容易變成非事件。任何給定服務器上的Web服務都可以重新啓動,並且其中的應用程序可以在不丟失有狀態數據的情況下重新初始化。如果數據持久化到磁盤(即,不完全在內存中運行),則服務器甚至可以重新啓動而不會丟失。服務器/服務可以進出農場,用戶永遠不會知道其中的差異。

此外,外部化這些數據可讓您以潛在有用的方式分析數據。查詢它,在其上運行度量標準,通過其他Web應用程序或完全脫機工具等與它進行交互。隨着項目日益複雜化,它真的開啓了選項。

(同樣,這並不是真正意圖回答你的問題,而只是添加你可能會覺得有用的信息。這是我和我的同事們最近一直在修補的東西,你的問題看起來像一個很好的一次寫入地方提到它。)

相關問題