2010-06-09 34 views
3

我正在使用PHP中的工具处理大量数据,需要一段时间才能完成。我想让用户更新正在发生的事情和处理当前任务。动态显示进度信息

你认为最好的办法是做什么?我有一些想法,但不能决定一个最有效的:

  • 旧的方式:执行脚本的一小部分,并用元重定向或一个JavaScript计时器显示页面给用户发送请求以继续该脚本(如/script.php?step=2)。

  • 不断发送AJAX请求以读取PHP通过fwrite()持续更新的服务器文件。

  • 同上,但PHP更新数据库中的一个字段而不是保存文件。

这些听起来不错吗?有任何想法吗?

谢谢!

回答

5

而不是写入到您使用AJAX或额外的数据库字段获取的静态文件,为什么没有另一个PHP脚本只是返回指定任务的完成百分比。然后,您的页面可以通过对所述PHP脚本的轻量级AJAX请求更新进度。

对于实施这个“进度”脚本,如果我对“处理大量数据”的含义有更多的了解,我可以提供更多的建议。如果您正在写入文件,您的“进度”脚本可以简单地检查文件大小并返回完成的百分比。对于更复杂的任务,您可以为特定流程分配基准,并基于最后完成或当前正在运行的流程返回估计完成百分比。

UPDATE

这是“检查进展”,它被简单地等待来自请求的响应的有源脚本的一个建议的方法。我有一个数据挖掘应用程序,我使用了类似的方法。

在您的脚本中,您正在等待的脚本(您要检查脚本的进度),您可以存储(在文件或数据库中,我使用数据库,因为我有数百个进程任何时候都需要跟踪他们的进度,而且我有另一个脚本,可以监视这些进程的进度)进程变量。当过程开始时,将其设置为1.您可以轻松选择脚本将传递的任意数量的“检查点”,并计算给定当前检查点的百分比。然而,对于一个大的请求,你可能更感兴趣的是知道请求完成的大概百分比。一种可能的解决方案是知道返回内容的大小,并根据任何时候收到的百分比设置您的状态变量。即如果您在循环中接收到请求数据,则每次迭代都可以更新状态。或者,如果您正在下载到平面文件,则可以轮询文件的大小。如果知道完成请求所需的大概时间,并简单地与脚本的当前执行时间进行比较,那么随着时间的推移(而不是文件大小),这可能会不准确。显然,这些都不是完美的解决方案,但我希望他们能给你一些洞察你的选择。

+0

嗨达斯汀,这个工具是一个提要爬虫,所以大部分的过程只是在等待响应。你如何让另一个PHP脚本“调用”一个活动脚本来获取百分比?谢谢! – 2010-06-09 21:18:50

+0

我已经更新了关于如何去做的简短讨论:) – defines 2010-06-10 13:48:26

+0

感谢Dustin的详细解释! – 2010-06-11 09:25:25

1

我建议使用AJAX方法,但不要使用文件或数据库。你可以使用会话值或类似的东西,这样你就不必创建连接或打开文件来做任何事情。

+0

PHP会话存储在文件中。 – 2010-06-09 20:42:07

+0

不一定,默认购买,是的。我仍然认为它比你的读者更快,并且自己写作。 – 2010-06-09 21:14:03

+0

不错,不知道你能做到这一点。这是迄今为止我读过的最简单但最有效的解决方案,但是如何设置会话存储方法?如果不在文件中,它们存储在哪里,RAM可能? Cheers Kerry – 2010-06-09 21:23:19

1

在过去,我刚刚写出消息到页面,并使用flush()来刷新输出缓冲区。非常简单,但它可能无法在每个Web服务器或每个Web浏览器上正常工作(因为它们可能会执行自己的内部缓冲)。

就我个人而言,我喜欢你的第二选择最好的。应该是可靠和相当简单的实施。

+0

我会经常为我在本地服务器上使用的个人工具(如果您是唯一一个能够看到它的人,为什么会打扰AJAX?)这样做,但我不会在生产环境中依赖此工具。 – defines 2010-06-09 20:34:25

1

我喜欢选项2 - 使用AJAX读取PHP定期写入的状态文件。这打开了很多不同的演示文稿选项。如果你为这个文件写了一个JSON对象,你可以很容易地解析它,并显示一些东西,比如进度条,状态消息等等......

0

一个'肮脏'但快速简单的方法就是回显脚本运行的状态。只要你没有输出缓冲,浏览器就会呈现HTML,因为它从服务器接收它(我知道WordPress使用这种技术来自动升级)。

但是,一个'更好'的方法是AJAX,但我不会说'分手'使用重定向有任何问题。

为什么不合并1 & 2,其中AJAX发送请求到script.php?step=1,检查响应,写入浏览器,然后返回更多script.php?step=2等等?

0

如果您可以取消IE然后使用服务器发送的事件。它是理想的解决方案。