2013-09-23 29 views
0

我正在PHP中開發一個站點。當用戶會話開始時,我加載了$ _SESSION var中的所有db行。當用戶更改數據庫值時,我也更新$ _SESSION變量。所有會話之間用戶數據的一致性

問題開始時多個會話是用於相同的用戶活動的。有沒有辦法更新同一用戶的所有會話的數據而不會超載數據庫?或者,或者,有沒有辦法強制PHP使用相同的會話文件,屬於同一用戶的所有會話?或者每次會話繼續時,我都必須簡單地查詢數據庫?

另一個困境是:它值得嗎?我的意思是,我不知道這個機制可以減輕服務器負載多少,我不知道這種機制是否適用於基於文件的會話,或者我必須使用另一個會話存儲類型。

這個問題具有一定的相關this other question on mine(即使這種情況的解決方法是簡單地刪除所有會議文件)。

+1

如果數據存在於數據庫中,則無需每次都通過會話進行傳輸。您只需要在會話中保存的記錄用戶。比方說,用戶登錄後,他更新了他的頭像或與他的user_id相關的內容。爲什麼你需要在$ _SESSION中保存$ row ['avatar'],當你每次都可以通過''SELECT用戶ID = $ _SESSION ['user_id']「' –

+0

@RoyalBg來訪問它時,調用數據庫,如果你保存了這樣的數據,請閱讀SESSION – djot

+0

完全@RoyalBg,你需要使用'user_id'更新數據庫中的evrything,然後如果你需要更新電子郵件或用戶名,然後更新到db然後再更新保存更新後的電子郵件或用戶名到會話 –

回答

1

它真的到了問題爲什麼你需要在$ _SESSION中的許多數據。而且你應該花一些時間來決定哪些數據經常需要顯示。

在大多數情況下,你只需要,保持用戶登錄,含user_id,直接從數據庫中取所需的數據會話標識符。

假設用戶可以更改它的頭像,並且你沒有去太多地方來顯示這個頭像,你不需要將它存儲在會話中,也不需要它在同一時間存儲它。例如,您可以擁有一個觸發器頁面,其中SELECTS的頭像通過$_SESSION['user_id']當他試圖將個人消息發送給另一個用戶時。否則,您可以放置​​一個緩存(即使用memcached),在該緩存中,不應每隔一小時更頻繁地選擇一個用戶頭像的查詢。

如果用戶更改電子郵件,它是一樣的。如果有人試圖向他發送消息,則觸發SELECT查詢。否則設置緩存。

所以,讓我們假設用戶已經改變了自己的形象,電子郵件,其他一些瑣碎的信息,然後訪問您的索引頁。在他的會話中,只加載標識符。在數據庫中存在記錄,但它們尚未被選中。所以你既沒有服務器負載,因爲會話很輕,也沒有數據庫負載,因爲沒有發送SELECT查詢。

無論用戶嘗試多少次把他說的會話(在這種情況下,記錄第二次),你有一個數據庫中的當前數據,只有用識別符的對話。您可以識別他的所有實例,但不要使用不需要的數據。

+0

謝謝你,memcached將是完美的:)關於SELECTing列,一次加載整個用戶行不是更好嗎? –

0

1嗯,我(不這樣做,但)可以用我的會話處理程序做到這一點。我使用基於數據庫的SESSIONS和一些額外的信息/列如用戶名和用戶標識符。這樣我就可以準確地確定哪個會話屬於哪個用戶,而不需要串行化數據。

http://php.net/manual/de/function.session-set-save-handler.php

2但是,在你的情況下,它可能是簡單的更新您的用戶表,然後再選擇用戶把(新)數據,以$ _SESSION [「用戶」]。 (您將需要一些「用戶數據已更新」信息,爲所有會話重新加載新數據)。

3或者您只是避免用戶可以多次登錄。

+0

每次重新查詢數據顯然要簡單得多:)但這不是問題。我真正的問題是如果像這樣的機制真的很有效率......我更新了我的問題,看到了「其他困境」。 –

+0

你真的需要這樣的功能嗎?我感覺你的「概念」是錯誤的。 – djot

相關問題