查找已更改的内容并仅上载更改

时间:2010-11-05 06:55:56

标签: javascript jquery html ajax performance

我只是在这里寻找想法/建议;我不是要求一个完整的解决方案(尽管如果你有一个,我会很高兴看到它)

我正在尝试找到一种只将更改上传到文本的方法。它最有可能被用作运行在jQuery和HTML上的基于云的应用程序,其中PHP服务器运行后端。

例如,如果我有像

这样的文字
asdfghjklasdfghjkl

我将其更改为

asdfghjklXasdfghjkl

我不想上传整件事(文字可以变得很大)

例如,发送到服务器的8,X之类的内容可能表示: add an X to the 8th position

D8,3可能表示: go to position 8 and delete the previous 3 terms

但是,如果单个请求在到服务器的途中损坏,整个文档可能会被破坏,因为位置会被更改。一个简单的哈希可以检测到腐败,但那么如何才能从腐败中恢复呢?客户端将拥有所有数据,但数据可能非常大,并且不太可能上传。

非常感谢您阅读此内容。以下是需要建议的简短摘要

  • 更改/修改检测
  • 传达变更的方法
  • 从腐败中恢复
  • 其他需要改进的事情

3 个答案:

答案 0 :(得分:4)

已经有一种可接受的传输此类“差异”信息的表格。它被称为Unified Diff

google-diff-match-patch提供Java,JavaScript,C ++,C#,Lua和Python的实现。

你应该能够在客户端的变量中保留“原始文本”和“修改后的文本”,然后在javascript中生成diff(通过diff-match-patch),将其发送到服务器,同时哈希,并在服务器上重新构造它(使用diff-match-patch或unix“patch”程序)。

您可能还想考虑在首先将原始文本发送到客户端时包含“版本”(或修改日期)。然后在客户端发送到服务器的“diff请求”中包含相同的版本(或日期)。在应用diff之前验证服务器上的版本,以确保在进行修改时服务器的文本副本没有偏离客户端的副本。 (当然,为了使其工作,每次更新主副本时,您都需要更新服务器上的版本号。)

答案 1 :(得分:1)

你有一个非常有趣的方法。但是如果文本文件非常大,每次上传它们都需要太多时间,为什么要将整个文件发送给客户端呢?客户端是否真的必须接收整个5mb文本文件?难道不可能只向他发送他需要的东西吗?

无论如何,对你的问题: 在听到“大文本文件”和修改检测时,我首先想到的是diff。对于算法,请阅读here。这可以是提交更改的方法,并为其指定格式。你只需要在javascript中重建diff(或其中的一部分)。这可能并不容易,但我认为可能。如果算法没有帮助你,可能至少可以使用diff文件格式的定义。

腐败问题:你不必担心你的日期在途中被破坏,因为HTTP所基于的TCP协议看起来所有东西都会到来而不会被破坏。您应该担心的是连接重置。你可以做一些握手吗?当客户端向服务器发送更新时,服务器应用修改并保留该文件的旧版本。为了确保客户端已经从服务器收到批准修改正常(这是连接重置发生的地方),客户端将另一个ajax请求发送回服务器。如果这个没有在定义的时间内到达服务器,则文件将在服务器端重置。

另一件事:我不知道javascript是否喜欢它来处理这样庞大的文件/数据......

答案 2 :(得分:1)

这听起来像版本系统(CVS,SVN,Git,Bazaar)已经很好地解决了这个问题。

它们在服务器上设置起来相当容易,您可以通过PHP与它们进行通信。

设置完成后,您将免费获得:版本控制,日志记录,回滚,并发更改处理,正确的diff语法,标记,分支......

您不会得到您要求的“仅发送更新”功能。我不确定这对你有多重要。就带宽而言,纯文本的发送非常便宜。

就个人而言,我可能会做出与Wikis类似的妥协。将整个文本分解为较小的语义连贯块(章节,甚至段落),在客户端确定编辑了哪些块(不进入字符级别),并发送它们。

然后,服务器可以使用由版本控制系统生成的差异来回答,这是他们非常有效地执行的操作。如果您想允许并发更改,您可能会遇到编辑必须进行手动合并的情况。

另一个一般暗示可能是看看谷歌对Wave做了些什么。我必须在这里保持一般性,因为我自己并没有真正详细研究它,但我似乎记得有一些关于他们如何解决实时并发编辑问题的文章,这似乎是确切的你想做什么。

总而言之,我认为您计划解决的问题远非微不足道,有些工具已经解决了许多相关问题,我个人会妥协并重新制定这种方法,以支持更少的工作量。 / p>