php页面程序运行需要时间,怎么给客户提示?

寅春树
  • 702

有一个页面打开时程序需要处理大量的数据,会耗费一些时间,但页面显示肯定是在程序全部处理完才显示的,这样的话我都没办法加进度条这样的提示。因为页面比较特殊,也没能用ajax。有没有其它更好的方法。

回复
阅读 3.4k
5 个回答
  1. 如果是直接打开的页面逻辑运行很久才能够加载出来页面。建议是在页面加载完后用JavaScript进行逻辑处理,最主要的还是逻辑优化吧。

  2. 如果是简单的通过a标签进行点击个人觉得可以用这种ajax加载,api改变地址栏url,载入动画,本地缓存ajax + pushState参考地址

如果不需要按百分比显示,直接打开时候加载一个loading图,显示请耐心等待。如果需要更精确的,就按百分比做进度条,百度一下一堆方法。
http://www.jb51.net/article/1...

yszou
  • 4.9k

但页面显示肯定是在程序全部处理完才显示的

当然不是。

使用 chunked 方式响应 ( Transfer-Encoding:chunked ),先把 HTML 的前面一部分吐出来,这时可以显示 LOADING ,再在 HTML 的最后部分加一段 JS 把 LOADING 处理掉。

上面一段话,需要你理解“网络连接”的概念。

下面是 Python 下的一个例子(我不知道 php 中如何自如控制连接):

# -*- coding: utf-8 -*-

import time
import tornado.web
import tornado.httpserver
import tornado.ioloop


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        content = '''
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head> <meta charset="utf-8" />
</head>
<body>
  <div id="loading">5秒后我再把自己清除掉 ...</div>
        '''
        self.write(content)
        self.flush()
        time.sleep(5)

        content = '''
<div id="main">好了,我加载完了.</div>
<script type="text/javascript">
document.getElementById('loading').remove();
</script>
</body>
</html>
'''
        self.write(content)
        self.finish()




Handlers = [
    ('/', IndexHandler)
]

def main():
    from tornado.options import options
    application = tornado.web.Application(Handlers)
    server = tornado.httpserver.HTTPServer(application)
    server.listen(8888)
    print 'SERVER IS STARTING ON %s ...' % 8888
    tornado.ioloop.IOLoop().current().start()

if __name__ == '__main__':
    main()

这种方式处理占用时间较长的脚本是非常不好的,用户很可能等不及,手动刷新页面,你的脚本会多次触发。你应该实现一个任务队列,页面加载只是增加一个事件到队列内。至于事件的处理结果,如果不能异步拉取数据,你就提示用户刷新页面查看处理进度,或者新建另一个页面来显示处理进度。

如果处理时间过长建议是异步处理,处理完了后再通知客户端,这样体验可能会好一点

宣传栏