2016-11-08 129 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版本,其块和整个机制。 –