2009-07-19 117 views
2

在一般情況下,我有以下情形:有沒有辦法清除所有會話中的一些會話數據?

  • 獲取產品,並從數據庫及其相關數據
  • 轉換獲取的數據到PHP的「產品」對象的會話
  • 緩存的產品對象

緩存是隻讀的,即客戶在網站上查看產品。

但有類似getProductIdsByCategory($categoryId)的調用,並且來自這些結果的productId也被緩存,每個用戶不使用我已閱讀過的全局緩存。

問題是,如果管理員端的某人添加了新產品並將其與某個類別關聯,則客戶將不會讓新產品出現在其緩存的getProductIdsByCategory中,直到啓動新的會話。

添加新產品時,是否有辦法從服務器上的所有會話中清除例如$_SESSION['x']?我不想銷燬所有會話,因爲客戶將失去登錄等。

或者我應該將這些緩存的productId搜索移至全局緩存嗎?

使用定製的緩存,而不是memcached或類似的。

感謝

回答

5

默認情況下,會話數據只是文件系統某處的序列化文件,並且可以修改所有這些文件以刪除有問題的信息(尊重鎖定,以便您不會踩到任何當前打開的會話)。

雖然我並不真的推薦它。我建議做一個信號發送方法,告訴這個緩存的數據應該刷新,就像數據庫存儲的時間戳一樣,當發生數據庫存儲的時間戳時,如果緩存的數據比時間戳早,緩存就被刷新。

3

聽起來像你可以用真正共享狀態通過緩存系統內存緩存一樣做。

打印到心中唯一的另一種方式是有標誌的應用程序檢查髒緩存數據並刪除它本身,或者如果你的緩存是在一個可分析的序列化形式的數據庫寫昂貴腳本讀取它們所有這些,但是這會在已經讀取數據的請求中產生令人討厭的滯後。

我會用真實的共享狀態去檢查對象副本。

+0

memcached是一種很好的「現代」做事方式嗎?我對此不甚瞭解。 – 2009-07-19 12:52:41

+1

@大衛,是的。任何可同時訪問的共享狀態都可以使用。一些ORM系統將允許這樣做。請記住,在任何系統中清除都會有差距,因爲PHP會將共享狀態複製到應用程序中。如果緩存很髒,或者需要類似的約束條件,則需要停止重新保存。這是你需要限制的輸入。 – 2009-07-19 12:55:17

-2

清除會話值使用:

unset($_SESSION['x']); 

您可以在該

+0

這將只清除當前用戶的會話。如果管理員用戶添加新產品,我需要清除所有用戶的所有$ _SESSION ['x'] – 2009-07-19 12:51:14

1

會議環路除非你存儲會話在數據庫中,清除數據的任何特定位將是棘手的。

我建議緩存在文件而不是用戶會話。通過這種方式,您可以獲得相同的好處,但您可以完全控制緩存內容以及清除時間。

0

是的,你應該把它移到全局緩存。會議並不是要全球訪問,我幾乎認爲這是不可能的。

1

要禁用特定應用程序的所有現有會話,只需修改您的應用程序以使用PHP的session_name('new_session_name')更改會話的名稱即可。這個函數需要在每次調用session_start()之前調用。

這實際上不會明確當前會話,但它使它們不再有用於此應用程序。

相關問題