2012-12-28 50 views
2

在編寫自定義會話處理程序時遵循哪些最佳實踐?我已經瀏覽了大部分現有的PHP框架,其中大部分似乎在處理會話ID更新時遇到併發問題和多個Ajax請求。默認的PHP會話使用文件鎖來管理這個,但是如果我正在使用mysql來存儲會話,似乎並沒有正確的方法來做到這一點。什麼是解決這個問題的最好方法?任何幫助讚賞。PHP中的自定義會話處理程序

+0

你問你是否可以模擬鎖定數據庫? –

回答

1

如果您不鎖定會話文件/另一個存儲行,則可能會丟失數據。

簡單的場景(假設你已經下降完全鎖定):

初始狀態:有2 Ajax的請求一個頁面上同時運行,其中的每一個增加了另一個關鍵會議:

  1. 請求A發送
  2. 請求B發送
  3. 腳本A讀取會話內存,它是空的
  4. 腳本B讀取會話內存,它s空
  5. 腳本A將密鑰A添加到會話中。現在它包含單個A密鑰(在內存中)
  6. 腳本B向會話添加密鑰B.現在,它包含一個B鍵(在內存中)
  7. 腳本A持續數據
  8. 腳本B持續數據

結果:鑰匙丟失

所以 - 如果你想保證會話中的數據是一致的 - 您需要有一些同步機制。例如,這可能是悲觀鎖,但仍然無法完全避免鎖定。