如何在多个用户之间共享对象

问题描述

我对一个奇怪的情况有疑问(不是很奇怪,但需要加以管理)。 我有一个 php 应用程序和一个客户要求进行特定的开发。 具体开发包含调查和可编辑表格,并分为多个部分。

section1 -> 调查和表格

section2 -> 调查和表格等...

每个部分加载起来都很繁重,只有在(由另一个用户更改)时,我才需要再次加载它。

这是主要问题,我不知道如何处理这种情况。 (我想为每个部分创建一些散列,当用户尝试打开会话时,比较此散列以了解是否相同...如果不再次加载该部分)。你有什么更好的主意吗?

解决方法

您可以使用乐观锁机制来实现这一点。

yii2 有一个相当不错的解决方案,可以去文档查看: https://www.yiiframework.com/doc/api/2.0/yii-db-baseactiverecord#optimisticLock()-detail

基本上 ActiveRecord 有一个内置的乐观锁功能。

乐观锁()

返回存储实现乐观锁的锁版本的列名。

乐观锁定允许多个用户访问同一记录进行编辑并避免潜在的冲突。万一用户尝试保存一些陈旧数据的记录(因为另一个用户修改了数据),将抛出 yii\db\StaleObjectException 异常,并跳过更新或删除。

只有 update() 和 delete() 支持乐观锁。

如果您使用 ActiveForm,您可以将 OptimisticLockBehavior 添加到您的模型类中,以便自动化该过程。

https://www.yiiframework.com/doc/api/2.0/yii-behaviors-optimisticlockbehavior

工作原理:

在收集用户输入的 Web 表单中,添加一个隐藏字段,用于存储正在更新的录音的锁定版本。

要使用此行为,首先按照optimisticLock() 中列出的步骤启用乐观锁,从 ActiveRecord 类的 rules() 方法中删除持有锁版本的列名,然后向其中添加以下代码:

use yii\behaviors\OptimisticLockBehavior;

public function behaviors()
{
    return [
        OptimisticLockBehavior::class,];
}

强烈建议扩展活动记录,只将行为附加到子类。在这种情况下,父类仍可用于内部使用。 (行为总是尝试检查 getBodyParams())

OptimisticLockBehavior 还提供了一个名为 upgrade() 的方法,该方法将模型的版本增加一个,当您需要在连接的客户端之间将实体标记为陈旧并避免对其进行任何更改时,这可能很有用,直到它们再次加载它

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...