通过Ajax / dojo显示大型文本文件

时间:2010-01-13 14:19:55

标签: php ajax dojo

我希望通过Web界面向用户显示一个大文本文件(具体为100MB日志文件),而无需用户下载整个文件。显然将整个文件返回到某人的网页浏览器是不明智的,所以我的理论是使用Ajax取决于用户滚动文件的部分文件,类似于Google Maps提供地图“窗口”的方式

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

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

4 个答案:

答案 0 :(得分:1)

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

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

例如,如果要显示25行,则需要在第一次使用时获取25 +底部填充,并将底部填充中显示的行定义为用于指示新事件下载额外25的阈值。 +底垫物品。

使用100mb的文件,很快就会变得缓慢,所以你必须清除之前的条目,并定义一个新的顶部填充来发出反向请求。也就是说,1 req:取25 +底垫,2 req取25 +底垫取下prev 25 - 顶垫。

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

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

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

答案 1 :(得分:1)

我建议缓存。

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

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

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

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

缺点:这将不可避免地增加磁盘空间量。优点:作为磁盘访问的快乐用户将被优化,脚本执行时间也将优化。而且,它可以很好地扩展。 (按O(n)的顺序)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果日志文件是一个行结束一致的文本文件,也许您可​​以按行号获取它。

我对这样的算法有所了解:

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

相关问题