有没有办法让 PHP 在页面执行大型脚本时向您显示进度?例如,如果我正在解析一个大型数组,我可以在整个过程中输出状态更新吗?
1 回答
我能想到的有四种方法可以做到这一点。我只用过其中两个:
1)您可以定期推送输出(刷新)并希望它通过浏览器。这可能仅在某些情况下有效 - Web 服务器(apache)可能会有自己的缓存并为您保留数据,直到它有足够大的数量,ISP / Workplace / User 可能有自己的缓存,可能在整个页面完成之前不要转发信息,最后浏览器可能不会显示它。所以不推荐。(不曾用过)
2)对本地文件(或数据库)进行状态更新,然后通过AJAX查询。这已在评论中提出,您无需仅通过上传文件来完成。您将使用 AJAX 调用来启动进程(使用通用标识符,例如会话来链接所有调用),然后进程将其状态更新为文件(链接到通用标识符),然后 AJAX 定期调用服务器并读取状态文件。当状态文件显示“完成”时,您可以重定向到新页面(使用状态生成)或仅通过 AJAX 更新。这种方法效果很好——我上次在移动设备上使用它以在等待后台事件时保持移动站点的连接;如果一切都失败了,我有一个“超时”。
3)批量运行PHP脚本。如果 PHP 有一个 max-execution-time 并且你可能会超过它,你就需要这个。基本上你运行 30 秒,然后在页眉中提供一个具有当前状态和元刷新的页面,该页面从最后一个离开的地方开始下一个进程。您通过 URL 和 HTML 传递状态。如果你采用这种方法,如果浏览器从未收到服务器的回复,那么如果互联网连接不可靠,它可能会失败;所以结合AJAX方法(即AJAX调用“请先做50个,等待完成,更新状态,请做下一个50个等待,更新状态等)是一个很好的混合解决方案。你还需要确保你的脚本可以安全地处理如果您从先前处理的位置开始处理。
4)您打开一个从浏览器到服务器的 javascript 套接字,并通过套接字进行更新。由于浏览器中缺少对套接字的支持,我从未使用过它,但是如果您了解受众并且他们的浏览器可以很好地支持套接字,则可以使用示例。