Php 多个用户无法编辑同一表单

Php 多个用户无法编辑同一表单,php,json,forms,flock,Php,Json,Forms,Flock,我有一个php代码,其中多个用户可以同时编辑表单,这给我们带来了问题,因为 最后一个保存表单的人将赢得淘汰其他用户更改的竞赛 目前,我正在使用JSON存储所有信息,但我将很快切换到数据库 您可以锁定文件或对其进行版本设置。每次保存完整版本时,都会在数据库中保存一个带有时间戳的userid。给一个“live”标志,这样你就可以说:这是要发布的live版本 当您有了这些信息后,您可以制作一些不错的git功能,如git diff、git merge(如果存在更多版本的话):) 布莱布·格松 我认为这是

我有一个php代码,其中多个用户可以同时编辑表单,这给我们带来了问题,因为 最后一个保存表单的人将赢得淘汰其他用户更改的竞赛


目前,我正在使用JSON存储所有信息,但我将很快切换到数据库

您可以锁定文件或对其进行版本设置。每次保存完整版本时,都会在数据库中保存一个带有时间戳的userid。给一个“live”标志,这样你就可以说:这是要发布的live版本

当您有了这些信息后,您可以制作一些不错的git功能,如git diff、git merge(如果存在更多版本的话):)


布莱布·格松

我认为这是一个临时解决方案,因为您不想在数据库中执行此操作

$fp=fopen(“lock.txt”、“r+”);
如果(flock($fp,LOCK_EX)){//获取一个独占锁
ftruncate($fp,0);//截断文件
fwrite($fp,“在这里写一些东西\n”);
fflush($fp);//在释放锁之前刷新输出
flock($fp,LOCK_UN);//释放锁
}否则{
echo“拿不到锁!”;
}
fclose($fp);

当第一个用户(首先登录的用户)正在编辑文本时,您可以阻止其他用户编辑文本。为此,您可以添加另一个.json文件,以按用户登录时间的顺序保存用户的最后一次活动。例如,假设用户1在1585844170(时间值为
time()
)登录,用户2在1s后登录。现在我们在activity.json中有了这个内容

{
    "user1": 1585844170
    "user2": 1585844171
}
通过一个简单的javascript间隔(使用Ajax),我们可以更新这个活动,比如说每1000毫秒更新一次。作为一个超时,当我们没有任何更新这个时间的请求时,让我们说5s之后,我们认为用户已经消失了。因此,每次用户发送更新活动时间的请求时,他都会得到一个json,结果表明他是否可以开始编辑。例如:

{
    "updated": true,
    "editable": false,
    "editingBy": "user1"
}
因此,当editable为true时,我们可以启用输入(文本区域等),并让用户开始键入!您还可以显示谁正在编辑
为了更好地理解这一点,假设user1已经不在了(在过去的5秒内他没有活动更新),现在user2发送了一个更新活动请求。在这种情况下,user1将被删除,user2现在可以编辑文本

{
    "user2": 1585844190
}


注意

1.当您收到编辑php文件中文本的请求时,还应检查该用户是否是允许的用户(因为该用户可以编辑javascript)

二,。您可以创建修改activity.json文件的函数,并在每次收到用户请求时运行该函数。

切换到数据库是解决此问题的方法。其他任何东西都只是试图在PHP中重新实现数据库。@Sammitch我们使用数据库和json来存储数据。在JSON中有什么方法可以做到这一点吗?我以后肯定会切换到数据库。也许我要用SQLite。目前,我正在寻找一个短期的解决方案。在触摸文件之前,使用锁定文件,甚至在读取文件之前。在你完全使用完锁之前不要松开它。接受多个进程争夺锁的性能下降。数据库是解决方法。如果你坚持使用这种(糟糕的)方式,你可以写一些信息,比如“XXX在dd mm yyyy hh:ii:ss打开的表单”,然后,当用户保存时,或者当超过5分钟时,你会认为表单是由最后一个用户保存的,并允许下一个用户在上面写。@Sammitch你在吗?