Php 创建顺序文档编辑系统的最佳方法(一次只能编辑一个文档)

Php 创建顺序文档编辑系统的最佳方法(一次只能编辑一个文档),php,javascript,mysql,ajax,Php,Javascript,Mysql,Ajax,下面有很多话,对不起-但我想很好地解释一下这种情况: 我正在创建一个允许任何登录用户编辑单个文档的系统,但我不希望多个用户能够同时编辑该文档 (仅供参考,我计划在我的网站上有无限数量的这些文档,用户可以创建新文档。基本上,想象一下谷歌文档,但一次只有一个用户可以编辑一个文档) 我目前有一个JavaScript/AJAX/PHP解决方案,它涉及到每个文档的一个数据库存储变量,该变量保存当前正在编辑该文档的用户的用户id。在该用户完成编辑之前,其他用户无法编辑该文档,并且该文档 当用户“完成”编辑(

下面有很多话,对不起-但我想很好地解释一下这种情况:

我正在创建一个允许任何登录用户编辑单个文档的系统,但我不希望多个用户能够同时编辑该文档

(仅供参考,我计划在我的网站上有无限数量的这些文档,用户可以创建新文档。基本上,想象一下谷歌文档,但一次只有一个用户可以编辑一个文档)

我目前有一个JavaScript/AJAX/PHP解决方案,它涉及到每个文档的一个数据库存储变量,该变量保存当前正在编辑该文档的用户的用户id。在该用户完成编辑之前,其他用户无法编辑该文档,并且该文档

当用户“完成”编辑(这意味着他们关闭了编辑窗口或保存了更改)时,文档将再次可供任何其他用户使用……或者至少在理论上应该如此。对于我正在开发的应用程序,尽快提供文档是很重要的。如果编辑用户保存他或她的更改,这不是问题,但是如果用户关闭编辑窗口而不保存任何更改,这就是问题

我目前的设置,考虑到非保存的情况,是对一个php页面进行定期的AJAX调用,该页面本质上说,“我仍在编辑。再给我两分钟的编辑时间。”因此,如果用户关闭页面,文档将在两分钟内对所有人可用。这对我来说太长了。我真的很想让它尽可能接近实时(尽管<10秒的延迟不会太糟糕)

这些文档是公开可见的,它们的状态以列表形式显示。当用户加载“查看可用文档”页面时,我需要执行查询以检查所有应显示的最近文档的状态,使编辑时间已过期的文档可用,并与当前可用的文档一起显示

为什么这个方法不好:当大量用户同时使用这个web应用程序时,它会涉及太多的db查询、检查和AJAX更新

有更好的方法吗?(我希望如此!)

其他资料: -我尝试使用window.unload(向“我已完成编辑”页面发送AJAX调用),但没有足够的时间执行AJAX调用。 -我认为我的主机提供商不允许使用持久化PHP脚本(我也没有任何持久化PHP脚本的经验)。 -即使我可以使用一个持久的PHP脚本,如果我必须同时运行大量这些脚本,我也会担心所涉及的处理。(100?1000?更多?我不知道需要多少处理能力。) -我无法运行cron作业。 -如果我让我的编辑客户的“我仍在编辑”AJAX脚本每10秒运行一次,而不是每分钟左右运行一次,那么如果我有很多用户,那么每秒将有大量AJAX调用,这将导致大量的db访问,这将是不好的

我意识到,我在这里提出的需求可能排除了一系列其他可能的好解决方案,但我很好奇是否有人能想出任何其他可能的方法来做到这一点

谢谢

编辑:(为评论添加相关回复)


不幸的是,这些不是实际的文件。它们是一种虚拟复合文件,由用户的个人贡献组成。想象一个页面,它不是一组文本,而是一组连续提交(从上到下)的文本段,这些文本段组合在一起构成完整的文档。每个用户提交的段都很短,并且单独存储在数据库中。--我知道这很奇怪,但对这个项目来说很有帮助和必要。

如果这些是实际文件,您可以使用中概述的技术

然后继续做你正在做的事情,如果在2分钟内或任何你想设置的时间内没有更改,就关闭它们上的文件

编辑:能否将当前使用的文档存储在内存中并从内存中访问它们?这将消除对大量数据库调用的需要,而且速度相当快。每隔30秒,您可以查询站点以重置文档计时器(内存中)。下一个有权访问该文件的人可以检查该文档计时器,如果该计时器>您预定的运行时间,您可以授予他们访问权限


非常有趣的问题

如果这些是实际文件,您可以使用中概述的技术

然后继续做你正在做的事情,如果在2分钟内或任何你想设置的时间内没有更改,就关闭它们上的文件

编辑:能否将当前使用的文档存储在内存中并从内存中访问它们?这将消除对大量数据库调用的需要,而且速度相当快。每隔30秒,您可以查询站点以重置文档计时器(内存中)。下一个有权访问该文件的人可以检查该文档计时器,如果该计时器>您预定的运行时间,您可以授予他们访问权限


非常有趣的问题

谢谢你的建议。不幸的是,这些不是实际的文件。它们是一种虚拟复合文件,由用户的个人贡献组成。想象一个页面,它不是一组文本,而是一组连续提交(从上到下)的文本段,这些文本段组合在一起构成完整的文档。每个用户提交的段都很短,并且单独存储在数据库中。(事实上,我将在上面重新发布这条评论,以帮助其他人澄清问题。)@Chuck's Edit-这是一个有趣的想法!将当前使用的数据存储在内存中…嗯。我不确定我的主机是否允许这样做,但我必须检查一下。我从来没有试过一个