PHP:最好的前进之路[序列化,对象,Redis]

PHP: Best way forward [serialisation, objects, Redis]

本文关键字:序列化 对象 Redis 之路 PHP      更新时间:2023-09-26

我开发一个PHP应用程序已经有一段时间了。其(基本)思想如下;用户可以使用块构建网页。这些块可以包含图像,文本等。每个模块都有自己的选项。这些块通过PHP在领域驱动设计中定义。

我已经构建了应用程序,使用基于php的控制器来处理来自jQuery/Javascript前端的请求。每次用户编辑一个选项时,它都会发送到这个控制器,该控制器会从Redis和/或php-session中反序列化一组块(php-object),并设置被编辑块的属性或添加/删除一个块。这是为了执行域逻辑。

这对我自己来说很好。我从来没有考虑过比赛条件之类的。在使用产品的过程中,我注意到人们丢失了数据。我将解释发生了什么;

  1. 用户编辑一个块的选项
  2. <
  3. 保存/gh>
  4. 向控制器发出请求,
  5. 反序列化集合和
  6. 根据block的uid
  7. 设置block
  8. 将块放回集合中,
  9. 再次序列化集合。

在某些情况下,可能会创建两个并发请求,这将覆盖两个请求中的一个的编辑。

我知道我需要重写应用程序的这一部分。问题是什么是最好的方法。我可以;

    实现一些javascript库,这将花费我大量的工作,因为它需要我重写整个应用程序的一部分。此外,我没有很多的经验,实现基于javascript的解决方案。但我不希望踏入新的领域。我确实想要javascript测试,以防止未来的问题发生,并启用跨浏览器测试
  1. 应用Redis/Session锁,只允许控制器处理单个请求,防止并发请求覆盖前一个请求中的数据集。这将降低并发请求和数据丢失的可能性,但不是全部。网速很慢的人可能会在产生大量并发请求时失去连接。

我很好奇我可能还缺少什么其他方法,或者我上面提到的两种方法中的一种是否足够。

据我所知,您可能想要实现的是乐观锁定。

实现它的一个简单方法是对聚合进行版本化。

每当有人编辑你的对象时,增加它的版本。

当您POST编辑的块时,您将返回您试图应用更改的版本。

然后,当你从持久化存储中取回你的对象时,你比较版本并确保你实际上正在处理一个最新的对象。

如果是,保存它,如果不是,拒绝修改,通知用户,并重新加载对象,并采取适当的操作(这取决于您的需要)。