执行时PHP进度更新


PHP Progress Update While Executing

在页面执行大型脚本时,有没有一种方法可以让PHP显示进度?例如,如果我正在解析一个大数组,我可以在整个过程中输出状态更新吗?

我能想到四种方法。我只使用过其中两种:

1) 您可以定期推送输出(flush),并希望它能通过浏览器。这可能只在某些情况下有效-网络服务器(apache)可能会有自己的缓存,并为您保存数据,直到数据量足够大,ISP/Workplace/User可能有自己的缓冲,在整个页面完成之前可能不会转发信息,最终浏览器可能不会显示信息。因此不建议使用。(未使用)

2) 对本地文件(或数据库)进行状态更新,然后通过AJAX进行查询。这已经在评论中提出了,你不需要仅仅通过上传文件来完成。您可以使用AJAX调用来启动进程(使用一个公共标识符,如会话来链接所有调用),然后进程将其状态更新到一个文件(链接到公共标识符),然后AJAX定期调用服务器并读取状态文件。当状态文件显示"完成"时,您可以重定向到新页面(使用状态生成),也可以通过AJAX进行更新。这种方法效果很好——我上次在手机上使用它是为了在等待后台事件时保持移动网站的连接;如果其他一切都失败了,我有一个"暂停"时间。

3) 批量运行PHP脚本。如果PHP有一个最长的执行时间,并且你很可能会超过它,你就需要这个。基本上,你运行30秒,然后提交一个具有当前状态的页面,并在标题中进行元刷新,从最后一个页面开始下一个进程。您可以通过URL和HTML来传递状态。如果你采用这种方法,如果浏览器从未收到服务器的回复,那么如果互联网连接不可靠,它可能会失败;因此,与AJAX方法相结合(即AJAX调用"please do first 50,wait for complete,update status,please do next 50 wait,update status etc.")是一个很好的混合解决方案。如果你从以前处理过的位置开始,你还需要确保你的脚本能够安全地处理处理。

4) 打开从浏览器到服务器的javascript套接字,并通过套接字进行更新。由于浏览器中对套接字的支持不足,我从未使用过这种方法,但如果你了解受众,并且他们的浏览器很好地支持套接字,那么就会有一些例子。