php - 创建顺序文档编辑系统的最佳方法(一次只有一个人可以编辑文档)

标签 php javascript mysql ajax

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

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

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

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

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

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

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

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

有一个更好的方法吗? (但愿如此!)

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

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

谢谢!

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

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

最佳答案

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

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

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

很有趣的问题!

关于php - 创建顺序文档编辑系统的最佳方法(一次只有一个人可以编辑文档),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4405680/

相关文章:

php - 定义 Laravel 对象

php - 什么是最安全的哈希方法? (PHP)

php - 如何做php网页和mysql数据库的审计日志?

php - 如何从 mysql 中的同一个表创建基于树的查询?

javascript - 使用 PHP 和 AJAX 的 Mysql UPDATE,无法更新数据库

javascript - Webdriver - actions.draganddrop 在 w3schools 页面中不起作用

javascript - 替换所有以冒号开头的字符串,例如快速路由路径

javascript - React Hooks 数组中元素的 setState

php - 数据未插入数据库

mysql - 将 MySQL 表转换为边缘列表