2014-09-29 99 views
3

對於我的登錄系統,我需要檢索一些用戶數據,範圍從用戶名到會話&'禁止狀態',用於檢查用戶是否被暫停。PHP登錄 - 從數據庫獲取用戶數據或存儲在會話中?

我見過一些系統從每個負載上的users中檢索這些數據。我的問題是:這是否被視爲對我的服務器不必要的壓力?

或者我應該只將這些數據存儲在我的$ _SESSION中?但它不會被更新,我不知道如何檢查禁止狀態。

謝謝!

+0

許多站點會檢查每個頁面加載的詳細信息 – 2014-09-29 02:38:51

回答

2

用於檢索每個請求上的用戶信息的單個數據庫查詢應該沒問題 - 它速度非常快,並且在服務器上沒有太大影響。您可以隨後在緩存中添加緩存(例如,APC或memcached),讓緩存每10分鐘過期一次,或者經常需要檢查用戶是否被禁用。但是我不會爲此煩惱,除非你的網站獲得了很多流量,而你實際上注意到了性能問題(換句話說,請避免premature optimization)。

編輯: 如果更改用戶的禁止狀態總是通過您的應用程序發生的,而不是直接在數據庫中,那麼你可以設置一些代碼,當用戶被禁止清除緩存運行。這樣在禁令生效之前不會有10分鐘的延遲(或緩存過期時間)。但正如我上面所說,你可能不需要首先打擾緩存。

+0

從用戶的角度來看,將會話數據存儲在memcache等中並不總是最好的想法。想象一下,每次緩存充滿或開發人員進行熱部署並清除它時,都會註銷:D但是這些都是特定於應用程序的。 – ZorleQ 2014-09-29 03:33:32

+0

我並不是建議將會話數據存儲在緩存中,而只是將數據庫中的數據存儲在緩存中,這樣您就不必在每個請求中查詢數據庫。無論緩存清除多少次,登錄用戶的ID和其他會話數據的ID都可以一直保留在會話中。 – 2014-09-29 04:42:53

2

這取決於

用戶名例如 是不必要的始終查詢數據庫來獲取用戶的用戶名,因爲多久很可能用戶改變他/她的用戶名?因此,當用戶登錄時,最好將它存儲在會話變量中

如果事實上,當用戶確實更改了他/她的用戶名,那麼在這種情況下,當用戶更改他的用戶名時,可以更新用戶的會話變量:

function changeUsername($username){ 
    $userId = $_SESSION['user']['id']; 

    //Code to change username 

    updateUserSession($userId); 
} 

function updateUserSession($userId){ 
    //Query new username and other information 
    $_SESSION['user'] = $dataFromQuery 
} 

潘基狀態示例 如果你有一個功能,它允許您禁止用戶。您仍然可以使用會話變量。這次在你的代碼中唯一的區別是,當你禁止用戶時,你將不得不清除並重新填充會話變量以用新信息更新它。然而,這樣做可能有點棘手,因爲禁止的人與被禁止的人不同,因此訪問用戶的會話變量是棘手的並且需要解決方法

因此,更好的方法來做到這一點你是否必須重複檢查每個頁面請求的禁止狀態?但是,對每個頁面請求執行查詢並不是一件壞事。事實上很多網站都會做數百個查詢。但是請注意,獲取所有信息的一個大查詢比獲得相同數量信息的一百個小查詢要好。

所以這一切都取決於你,使用會話變量的用戶名和禁止狀態示例顯然是過度殺手,但我反正說這是爲了說明如果他們想要如何做。沒有任何錯誤,事實上,這是推薦用於流量高的站點,因爲在會話變量中存儲值的形式爲caching。還有其他方法可以緩存數據,但這是其中的一種方式

+0

我同意,如果您只需要知道用戶名,將其存儲在會話變量中會更好。但是爲了檢查被禁止的狀態,正如你所說在會話中存儲它會很棘手,而且我認爲沒有這樣做的好處。只需通過APC或memcached中的用戶標識查找用戶數據就簡單多了。但是,是的,在某些情況下會話也可以用於緩存(用戶名就是一個很好的例子)。 – 2014-09-29 04:53:58

相關問題