我希望通过Web界面向用户显示一个大文本文件(具体为100MB日志文件),而无需用户下载整个文件。显然将整个文件返回到某人的网页浏览器是不明智的,所以我的理论是使用Ajax取决于用户滚动文件的部分文件,类似于Google Maps提供地图“窗口”的方式
我的应用程序服务器是PHP,我相当确定我可以执行适当的搜索并读取文件并通过XHR将结果返回给应用程序,但我的Ajax框架是dojo,我想不出任何标准的dijit会工作,并试图弄清楚如何最好地暗示某些东西。
我应该派生自己的小部件吗?那里有我不知道的东西吗?如果我构建自己的自定义小部件,它应该采用什么样的结构,是否有任何好的资源来开发dojo / dijit的自定义小部件?还有其他想法吗?
答案 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)
如果日志文件是一个行结束一致的文本文件,也许您可以按行号获取它。
我对这样的算法有所了解:
<ul><li>
我对Dojo了解不多。我在我的应用程序中使用jquery tools's scrollable。当滚动器到达最后一页时,很容易放置一个事件处理程序,然后获取下一个项目。