我正在使用PHP工具处理大量数据并需要一段时间才能完成。我想让用户了解正在进行的操作以及当前处理的任务。
您认为最好的方法是什么?我有一些想法,但无法决定最有效的想法:
旧方法:执行脚本的一小部分,并使用Meta Redirect或JavaScript计时器向用户显示页面,以发送继续脚本的请求(如/script.php?step=2
)。< / p>
不断发送AJAX请求以读取PHP通过fwrite()继续更新的服务器文件。
与上述相同,但PHP会更新数据库中的字段,而不是保存文件。
这些听起来不错吗?有什么想法吗?
谢谢!
答案 0 :(得分:5)
为什么不使用另一个PHP脚本来简单地返回指定任务的完成百分比,而不是写入使用AJAX或额外数据库字段获取的静态文件。然后,您的页面可以通过非常轻量级的AJAX请求更新进度到所述PHP脚本。
至于实施这个“进步”脚本,如果我能更深入地了解“处理大量数据”的含义,我可以提供更多建议。如果要写入文件,则“progress”脚本可以只检查文件大小并返回完成百分比。对于更复杂的任务,您可以为特定流程分配基准,并根据最后完成或当前正在运行的流程返回估计的完成百分比。
<强>更新强>
这是一种“检查活动脚本的进度”的建议方法,它只是在等待请求的响应。我有一个数据挖掘应用程序,我使用类似的方法。
在你正在等待的请求的脚本中(你想检查进度的脚本),你可以存储(在文件或数据库中,我使用数据库,因为我有数百个进程正在运行在任何时候都需要跟踪他们的进度,我有另一个脚本,允许我监视这些过程的进度)进程的进度变量。当过程开始时,将其设置为1.您可以轻松选择脚本将传递的任意数量的“检查点”,并计算给定当前检查点的百分比。但是,对于大型请求,您可能更有兴趣知道请求已完成的大致百分比。一种可能的解决方案是知道返回内容的大小,并根据随时收到的百分比设置状态变量。即如果您在循环中收到请求数据,则每次迭代都可以更新状态。或者,如果要下载到平面文件,则可以轮询文件的大小。如果您知道请求完成所需的大致时间并简单地与脚本的当前执行时间进行比较,则可以通过时间(而不是文件大小)更准确地完成此操作。显然,这些都不是完美的解决方案,但我希望它们能让您对自己的选择有所了解。
答案 1 :(得分:1)
我建议使用AJAX方法,但不使用文件或数据库。您可以使用会话值或类似的东西,这样您就不必创建连接或打开文件来执行任何操作。
答案 2 :(得分:1)
过去,我只是将消息写入页面并使用flush()
来刷新输出缓冲区。非常简单,但它可能无法在每个Web服务器或每个Web浏览器上正常工作(因为它们可能会执行自己的内部缓冲)。
就个人而言,我最喜欢你的第二个选择。应该可靠且相当简单。
答案 3 :(得分:1)
我喜欢选项2 - 使用AJAX读取PHP定期写入的状态文件。这开辟了许多不同的演示选项。如果您将JSON对象写入该文件,您可以轻松地解析它并显示进度条,状态消息等内容......
答案 4 :(得分:0)
“脏”但快速简便的方法是在脚本运行时回显状态。只要您没有输出缓冲,浏览器就会在从服务器接收HTML时呈现HTML(我知道WordPress使用这种技术进行自动升级)。
但是,是的,'更好'的方法是AJAX,虽然我不会说'分解'使用重定向有什么不妥。
为什么不加入1&amp; 2,AJAX向script.php?step=1
发送请求,检查响应,写入浏览器,然后在script.php?step=2
返回更多,依此类推?
答案 5 :(得分:0)
如果你可以取消IE,那么使用服务器发送的事件。它是理想的解决方案。