2011-03-02 30 views
1

我正在使用Zend_Session_SaveHandler_DbTable在多個機器間共享會話數據。Zend_Session_SaveHandler_DbTable和併發請求

根據以下示例,我遇到了併發請求問題。請求A和B運行在同一時間對同一用戶

  1. 請求A - 在用戶的會話數據讀取
  2. 請求B - 通過添加可變表面處理 - 在用戶的會話數據
  3. 請求B讀取XYZ到會話並寫入會話數據到數據庫
  4. 請求A - 表面處理和寫入原來的會話值回數據庫

結果。我們失去了xyz變量。請注意,請求A回寫數據庫,即使它沒有更改會話變量。我認爲這是因爲它需要更新會話的修改時間。

問題是請求A不鎖定會話,它看起來像Zend_Session_SaveHandler_DbTable不支持會話鎖定。有沒有人有任何關於如何解決這個問題的例子?使用memcached或返回基於文件的會話不是一種選擇。

暫時我已經破解了Zend_Session_SaveHandler_DbTable寫入方法來比較在讀取和寫入時的修改日期,如果不同,請不要將會話寫回數據庫。

回答

0

您看到的行爲與預期相同。 (這並不意味着它不

的默認的基於文件的會話處理器實際上是不斷session_startsession_write_close /腳本結束之間的會話文件的獨佔鎖定。這隻允許用戶的一個請求一次運行。

PHP開發人員似乎希望每個自定義會話處理程序獨立處理鎖定問題。這並非無理,但這是一個痛苦的屁股。

你使用的解決方案可能是安全的,理智的。它比試圖在SQL中建立鎖定要好,當腳本異常退出並且無法釋放鎖定時會變得很麻煩。您應該考慮充實自定義代碼以使鎖定可選,然後將該代碼提交給Zend Framework項目,這樣其他人可能會受益。