4

我怀疑这个问题看起来太......愚蠢,但我试图让我的头脑围绕一个很好的解决方案,我有点卡住了。

所以,这是我的情况:

  • 我正在使用Ajax执行一系列任务。实际上,我正在排队(或有时并行,对我来说并不重要)1 个或多个请求。
  • 以百分比形式显示进度(执行 X 个任务中的 1 个)
  • 完成后,显示最终结果。

我正在尝试做的事情:

  • 我不想运行 3-4 个不同的任务(= 3-4 个通过 Ajax 异步调用的不同 PHP 脚本),我希望只有 1 个(= 1 个脚本)——换句话说,将 X 脚本组合成一个. (这很容易)。

我面临的问题:

  • 我怎么还能报告完成百分比(X 个任务中的 1 个)?

有任何想法吗?

4

4 回答 4

3

Memcached每次任务完成时,我都会更新一个密钥。然后你会让你的 ajax 调用简单地从你的 memcached 键中获取值。

http://php.net/manual/en/book.memcached.php

于 2012-07-30T10:58:10.693 回答
1

如果您通过原始 ajax 将请求放入数据库,然后启动脚本,您仍然有时间(假设请求需要一些时间才能完成)将后续任务放入同一数据库以由仍在运行的脚本。

至于报告它,也许运行一个快速的 jquery 来查看队列中有多少项目?或者让 task.php 文件更新数据库(甚至可能是另一个表),以说明它已经完成了多少作业以及当前仍有多少作业在队列中。

于 2012-07-30T10:41:06.263 回答
1

如果您不需要向 PHP 脚本发送太多数据,则可以使用“长轮询”方法。有了这个,你不使用 AJAX,而是插入一个脚本标签,如下所示:

<script src="my_php_script?task1=x&param_t1_1=42&task2=y"></script>

然后 PHP 文件可以发回一个 JavaScript 命令,例如

updatePercent(12);

每项任务完成后。这些命令应该在它们进入时由浏览器执行。确保flush在每个任务之后调用。

研究 Comet可能会给您关于如何处理客户端-服务器连接的其他想法。

于 2012-07-31T15:17:41.187 回答
0

您可以管理队列 - 在发送 AJAX 请求之前 - 将任务放入队列(可以是对象或数组)。使用函数异步运行 AJAX,complete该函数将在完成后从队列中删除作业。您可以在从队列中删除作业的同时更新进度或单独处理它setTimeout(),这将检查队列中有多少任务以及总共放入了多少任务:% = (submitted_tasks - items_in_queue) / submit_tasks * 100

于 2012-07-30T10:47:35.157 回答