【发布时间】: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