【问题标题】:Displaying Large Text Files via Ajax/dojo通过 Ajax/dojo 显示大文本文件
【发布时间】:2010-01-13 14:19:55
【问题描述】:

我想通过 Web 界面向用户显示一个大文本文件(特别是 100MB 日志文件),而无需用户下载整个文件。显然将整个文件返回到某人的网络浏览器是不明智的,所以我的理论是使用 Ajax 根据用户滚动文件来获取文件的一部分,类似于谷歌地图提供地图“窗口”的方式.

我的应用程序服务器是 PHP,我相当确定我可以执行适当的查找和读取文件并通过 XHR 将结果返回给应用程序,但我的 Ajax 框架是 dojo,我想不出任何标准 dijit会起作用的,我正在尝试弄清楚如何最好地暗示某些东西。

我应该派生自己的小部件吗?是否已经有一些我不知道的东西?如果我构建自己的自定义小部件,它应该采用什么样的结构,是否有任何好的资源可用于为 dojo/dijit 开发自定义小部件?还有其他想法吗?

【问题讨论】:

    标签: php ajax dojo


    【解决方案1】:

    This seems to be a tut on what you might need我建议你使用 li,因为你最终会想要在每一行上执行一些操作,很可能每一行都是相关的。

    滚动很好,但你也可以只用分页来blit界面,这意味着他们点击下一页,上一页,然后你获取它,然后更新视图。这是最简单的方法。通过滚动,您需要在当前可见行的上方和下方获得更多以实现无缝滚动。

    例如,如果您想显示 25 行,则需要在第一次获取 25 + 底部填充,并将底部填充中显示的行定义为发出新事件以下载额外 25 的阈值+ 底垫项目。

    对于一个 100mb 的文件,它很快就会变得迟缓,所以你必须清除以前的条目,并定义一个新的顶部垫来表示请求获取反向。也就是说,1st req: fetch 25 + bottom pad, 2nd req fetch 25 + bottom pad remove prev 25 - top pad。

    需要注意的一点是,当您这样做时,至少在 Firefox 中,它可能会变得不稳定,并且在几次加载后不会触发事件,因此您可能希望取消绑定/重新绑定您的偶数侦听器。我之所以这么说只是因为我有一个朋友目前正在研究具有类似功能的东西,而这些是他遇到的一些问题。

    没有人会抱怨他们必须点击下一页/上一页,它会快速而干净,但会打乱你的滚动,没有人会想要使用你的小部件。

    以下是有关该主题的其他一些资源:Old Ajax Scrollable Table -Twitter like load more tut - Good scrolling example, read the source - Check out this googlecode project

    【讨论】:

    • 关于分页的有趣想法。老实说,我没有考虑过(我不知道为什么)。感谢您的意见,以及需要做什么的粗略概述以及可能可行的替代方案。
    • 很高兴能提供帮助,不要担心时髦的功能,功能第一是我的座右铭。祝你的项目好运!
    【解决方案2】:

    我推荐缓存。

    需要注意的是,这个问题的解决方案应该考虑到从磁盘读取足够大的文件 (100mb+) 将是磁盘绑定的,并且可能会超过您的 Web 服务器为脚本执行时间设置的任何超时.为了避免让用户等待过多的时间来加载文件的任何部分,我会避免像更改服务器的超时限制这样的黑客行为。

    想到了一种可能的解决方案: 1)通过将文件分成单独的文件来缓存文件。您可以在 cron 作业中轻松执行此操作,甚至在写入文件时触发它。使用 readfile_chunked (http://cn2.php.net/manual/en/function.readfile.php#48683) 或类似的。

    2) 编写一个服务处理程序脚本,当从浏览器调用时(比如 './readfile?chunk=##')返回请求的块。

    3) 使用其他贡献者建议的分页小部件或滚动条通过 AJAX 调用服务处理程序。

    缺点:这将不可避免地增加磁盘空间量。优点:用户满意,因为磁盘访问将得到优化,脚本执行时间也会得到优化。此外,它的扩展性很好。 (在 O(n) 的数量级上)。

    【讨论】:

    • 虽然很有趣,尤其是“readfile_chunked”,我会研究一下。问题是会有 160,000 个这样的日志文件,其中只有 10-20 个可能会被 5-10 个用户查看。我已经有一个以有意义的方式索引它们的过程,但我想提供一种查看日志的方法,而无需在本地下载存档并找到用户正在寻找的 20 或 30 行。
    【解决方案3】:

    您是否考虑过使用 Dojo Grid 来查看日志?它具有对“页面”(即数据行)动态加载的内置支持。

    【讨论】:

    • 我考虑过...这对于我需要的东西来说有点太复杂了,而且有些 UI 元素不适合我需要的工作方式,但有趣的是你应该提到它,因为我决定继续编写一个自定义的 dojo Widget 和 Datastore 来满足我的需要,我发现dojox.grid._Scroller 是网格的一部分,它与我需要的非常相似,并且正在获取很多线索从它。
    【解决方案4】:

    如果日志文件是一个行尾一致的文本文件,也许你可以通过行号来获取它。

    我对这样的算法有想法:

    1. 当页面加载时,从文件中获取前 100 行。将它放在某个容器中,可能是 div、textarea 或使用 <ul><li>
    2. 放置一个事件处理程序以了解用户已滚动到容器的最后一部分。
    3. 发送 AJAX 请求以从文件中获取下 100 行。将行偏移作为参数(GET 或 URI 参数)传递,以便 PHP 脚本可以获取文件的正确部分
    4. 将 AJAX 响应放到容器末尾,更新下一个 AJAX 请求偏移量。
    5. 如果文件中没有更多行,则返回空响应。 AJAX 处理程序应将此视为文件结尾,因此将在上述第 2 步中删除事件处理程序。

    我对 Dojo 了解不多。我在我的应用程序中使用jquery tools's scrollable。当滚动条到达最后一页时,很容易放置一个事件处理程序,然后获取下一项。

    【讨论】:

    • 是的,这和我想的差不多,但是如果我一直在浏览器的内存中加载和加载对象,我最终会爆炸的。我想我需要担心卸载对象。 dojo 有一个类似的对象,称为dojox.layout.ScrollPane。我也许可以从中得到一些东西。
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 2022-01-11
    • 1970-01-01
    • 2022-11-13
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多