我有一个通过AJAX调用运行的PHP脚本,对某些人来说有时需要很长时间(最长30秒)。为了帮助引起访问者的注意,我展示了一个进度条,指出了该过程的进展情况,以及列出有关Web应用程序所做的事情的随机事实等等。
为了更新进度条以准确显示进程在%中的距离,脚本会向进程写入进程所处状态的“状态”,以及需要执行的数量的“总计”,以及一个“进步”,说明它做了多少。在进行长时间的AJAX调用时,会对列出这3个会话变量的页面进行另一个单独的AJAX调用,以便它可以将其转换为JavaScript中的准确进度条,并且每0.5秒左右重复一次。
问题是,为了使第二个AJAX调用能够检索会话数据,必须关闭会话。因此,在长度脚本中,它会打开会话,写入数据,然后关闭它。
这样做会导致任何重大的性能损失吗?是否有更好的替代方案来显示漫长的AJAX呼叫有多远?
编辑:我应该更仔细地选择我的话。过程过去需要30秒以上,并且有必要显示真正的进度条而不是重复的gif。更改算法后,现在平均只需要1-5秒,但我猜想在极端情况下可能会达到10秒。它是异步的,页面上还有其他内容,他们必须选择启动该过程。他们可以转到其他页面甚至关闭窗口,稍后再回来看它完成。既然时间跨度显着降低,我想知道我是否因为试图显示“真正的”进度条而损害其快速性能,或者是否还有其他替代方法。
答案 0 :(得分:0)
三十秒是任何人在网上等待任何事情的很长时间,这听起来像是在你的界面阻塞(我的意思是用户不能去做其他工作,他们必须等待任务到完成)。你需要小心让这个数字变得太大,可以超时一个请求
如果你在服务器上做某事由于某种原因根本无法快速完成,我会立即将用户返回到UI的正常流程,并有一些异步方法来更新用户的完成(“状态” “地区等)。例如,许多照片上传网站都会以这种方式行事 - 在处理照片时,他们会将占位符图片放上,然后在编码和调整大小完成后用照片刷新用户的UI。
答案 1 :(得分:0)
听起来很复杂,但没有理由认为关闭会话有任何特别高的代价。在这种情况下,服务器只是指定连接的监听器。当然,当没有必要时,任何过度调用通常都是一个坏主意。如果您认为这种奇怪的行为可能是通过关闭会话引起的,那么您应该看看在没有任何进度条反馈的情况下运行需要多长时间。是时候确定了。如果它大致相同,我不会太担心会话结束,但我会调查它是否真的是服务器花了那么多时间。如果速度明显加快,请记住这可能是一些因素,不一定会关闭会话。
答案 2 :(得分:0)
也许你在前端预加载太多了?人们不喜欢等待事情发生,尤其是如果需要30秒。你可能想要考虑使用异步javacscript延迟加载一些东西。
我比会议时间更关注这个问题。