您的位置:首页 > 其它

一个数据收集进度条的实现

2012-07-28 15:42 369 查看
这次项目涉及到一个淘宝数据收集的过程,使用thinkphp实现的整个网站。其中在数据收集的过程中,因为数据导入是一项很费时的事情,如果让导入页面一直没有响应,用户都不知道发生了什么事情。三波一折,总算是完成了一个简单的进度条。

第一波:我在后台页面的处理函数中调用this->display('')显示页面,而在对应的显示页面中定时调用后台的report函数,report则取出保存在session中的stage和progress。stage和progress是在处理函数中随时更新的(这种方法问题在于php是单线程的,即使调用了display也不会立即显示页面);
第二波:ajax请求导入数据,然后定时询问。和上面一样,每次处理都把阶段和进度写入session中,按道理来说是可以的,不过并没有预期的效果,总是在最后蹦出个导入完成,100%。后来将进度写入到数据库中,然后定时询问数据库,同样没有效果。感觉是不是以为写入太频繁了,虽然也有降低频率,但是依然没有收到好效果,看来必须完全放弃这种方式了;
第三波:ajax应答式。将收集过程分为多个阶段,使用ajax提交请求。ajax提交格式为 table和page,返回结果指明下一次的table,当前页,总页数 和 是否结束。因此我想当然的使用了while循环,即没有完成就一直循环提交请求。结果不知道把FF弄崩溃了好几次,淘宝api也限制了我的使用。现象是 单步调试没问题,但是一旦运行起来就卡死。后来终于发现普通的ajax调用时异步的,所以我的while循环在很短的时间内向服务器提交了无数个请求,导致服务器也向淘宝提交了无数个请求,各种崩溃中。
第一折:ajax同步方式。这种方式在上面的基础上,将ajax请求修改为同步的,这样,每次提交都等待上一次的结果。这次在FF中成功运行了,当我看到进度条傻傻的前进时着实兴奋。不够很快我就发现有两个问题:1,进度条不平滑,没有动画效果,直接分成几个阶段,很死板;2,重要的是chrome和ie中都无法看到效果,依然是卡顿然后是100%。后来查了一下,好像是chrome和ie在ajax的同步方式上是有问题的,看来还是不行。既然ie都无法支持,看来同步方式是留不得,只能采取异步;
功成:ajax异步方式。既然是异步方式,那么必须有一个变量判断ajax是否返回。如果返回了,则再次提交请求直到结束。在每次定时任务都可以修改进度条的值,这样也可以解决动画问题。只是每次返回的值中需要提供此阶段的最大值,以保证每次请求返回的时候进度条没有设置到超过这一次的进度即可。

通过这次问题的解决,我发现自己在做事之前并没有充分的思考成熟,所以才有了前面的一折三波。总之,要深刻理解基本概念,想清楚问题后再动手才会事半功倍。END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐