【问题标题】:Best Way To Create Sequential Document Editing System (Only one person can edit a document at a time)创建顺序文档编辑系统的最佳方法(一次只有一个人可以编辑文档)
【发布时间】:2010-12-10 04:33:35
【问题描述】:

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

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

(仅供参考,我计划在我的网站上拥有不限数量的此类文档,用户可以创建新文档。本质上,想象一下 Google Docs,但一次只有一个用户能够编辑文档) .

我目前有一个 JavaScript/AJAX/PHP 解决方案,该解决方案涉及每个文档的数据库存储变量,该变量包含当前正在编辑该文档的用户的用户 ID。在该用户完成之前,没有其他用户可以编辑该文档,并且该文档

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

我当前的设置,考虑到非保存的情况,是定期 AJAX 调用,到一个 php 页面,基本上说,“我还在编辑。再给我两分钟的编辑时间。”因此,如果用户关闭页面,文档将在两分钟内对所有人开放。这对我需要的东西来说太长了。我真的很想让它尽可能接近实时(尽管

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

为什么这种方法不好:当大量用户同时使用这个网络应用程序时,它涉及到太多的数据库查询、检查和 AJAX 更新。

有没有更好的方法来做到这一点? (希望如此!)

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

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

谢谢!

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

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

【问题讨论】:

  • 您确定每分钟进行一次 ajax 调用并额外提供 2 分钟的编辑时间是个问题吗? 1000 个并发编辑器仅意味着每秒 17 个请求,任何功能强大的 Web 平台和数据库都可以完美处理这些请求。此外,如果需要,您可以将“锁定”信息存储在 memcached 中,而不是存储在数据库中。
  • 嗯...我想您对服务器负载的看法是正确的。我目前的设置可能没有我想象的那么糟糕。在这种情况下,Memcached 将是一个不错的选择,但我的主机并未将它作为当前 PHP 构建的一部分提供。还有其他方法可以在内存中设置/获取数据吗?

标签: php javascript mysql ajax


【解决方案1】:

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

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

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

非常有趣的问题!

【讨论】:

  • 感谢您的建议。不幸的是,这些不是实际文件。它们是一种由用户个人贡献组成的虚拟复合文件。想象一个单一的页面,而不是一个单一的文本集,而是一组连续提交(从上到下)的文本段,它们组合起来构成完整的文档。每个用户提交的片段都很短,并且单独存储在数据库中。 (实际上,我将在上面重新发布此评论,以帮助其他人澄清事情。)
  • @Chuck 的编辑 - 现在这是一个有趣的想法!将当前使用数据存储在内存中……嗯。我不确定我的主机是否允许这样做,但我必须检查一下。我以前从未尝试过这样的事情,但这听起来像是需要研究的东西。我知道我可以创建 MEMORY 类型的 MySQL 表,但是将它存储在实际内存中会比执行一堆数据库查询更有效。最重要的是,“用户 x 正在编辑文档 y”数据集不会占用每个用户文档组合的太多内存。关于如何做到这一点的任何想法?不幸的是,我没有 Memcache 扩展。
  • Memcache 是我所知道的唯一实现它的方法。在接下来的几天里,我会记住它,如果有任何事情发生,我会告诉你。 :-/
  • 虽然我自己不能使用 memcache,但我仍然会将其标记为已回答(因为它可能会帮助其他拥有 memcache 的人)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2010-10-24
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多