2016-11-08 71 views
0

我一直在開發PHP應用程序很長一段時間。 (基本)想法如下:用戶可以使用塊建立網頁。這些塊可以包含圖像,文本等。每個塊都有自己的選項。這些塊是通過PHP在域驅動設計中定義的。PHP:最好的方法[序列化,對象,Redis]

我已經構建了應用程序來使用基於php的Controller來處理來自jQuery/Javascript前端的請求。每次用戶編輯一個選項時,它都會發送給該控制器,該控制器從Redis和/或php會話中解密一組塊(php對象),並設置編輯塊的屬性或添加/刪除其中一個塊塊。這是爲了執行域邏輯。

這很好,會爲我自己開發。我從未考慮過比賽條件等因素。在推進產品的同時,我注意到人們失去了數據。我會解釋發生了什麼;

  1. 用戶編輯的塊的
  2. 按保存
  3. 的請求到控制器發出一個選項,
  4. unserialises收集和
  5. 集塊基於它們的UUID
  6. 將塊重新放回集合中,並且再次將集合序列化。

有情況下,可能會創建2個併發請求,這將會覆蓋兩個請求的編輯1。

我知道我需要重寫這部分的應用程序。問題是什麼是最好的方法。我可以;

  1. 實現一些JavaScript庫,這將需要我很多工作,因爲它需要我重寫整個應用程序的一部分。此外,我沒有很多實施基於JavaScript的解決方案的經驗。但我不會踏入新的事物。我想javascript測試,以防止未來發生的問題發生,並啓用跨瀏覽器測試
  2. 應用Redis /會話鎖定,只允許控制器處理單個請求,並防止併發請求覆蓋前一個請求中的數據集。這將降低併發請求和數據丟失的可能性,但並不完全。真正的互聯網連接速度慢的人可能會在他們可能產生大量併發請求時失去連接。

我很好奇我可能會錯過什麼其他方法,或者如果我上面提到的兩個之一就足夠了。

+0

許多優秀的問題都會根據專家的經驗產生一定程度的意見,但對這個問題的回答往往基於意見,而不是事實,參考或具體專業知識。你可能想要找到一個開發論壇(也許[quora](http://www.quora.com/Computer-Programming?))來計算一般性。然後,當/如果您有特定的編碼問題,請回到StackOverflow,我們很樂意提供幫助。 –

回答

1

據我瞭解你的問題,你可能想要實現的是optimistic locking

一個簡單的方法來實現它,將版本的聚合。

每次有人編輯你的對象時,增加它的版本。

當您編輯的塊爲POST時,您將發送您嘗試應用更改的版本。

然後,當從持久性存儲獲取對象時,比較版本並確保實際上正在處理最新的對象。

如果是,保存它,如果不是,則拒絕修改,通知用戶並重新加載對象,並採取相應的操作(這取決於您的需要)。

+0

鮑里斯,感謝您的評論,並對我遲到的回覆感到抱歉。我會盡快研究這個!這將是一個快速修復/解決方法。最好的做法是構建這個處理程序的JavaScript版本,其塊和整個機制。 –

相關問題