我怀疑这个问题似乎也会...很愚蠢,但我试图找到一个不错的解决方案,但我有点卡住了。
所以,这是我的情况:
- 我正在使用Ajax来执行一系列任务。实际上,我正在排队(有时是并行的,对我来说并不重要(1 个或多个请求。
- 以百分比形式显示进度(执行的 X 个任务中有 1 个(
- 完成后,显示最终结果。
我想做什么:
- 与其运行 3-4 个不同的任务(= 3-4 个通过 Ajax 异步调用的不同 PHP 脚本(,我只想有 1 个(= 1 个脚本( - 换句话说,将 X 脚本合并为一个。(这很容易(。
我面临的问题:
- 我如何仍能报告完成百分比(X 个任务中的 1 个(?
有什么想法吗?
任务完成时,我都会更新Memcached
中的键。然后你会让你的 ajax-call 简单地从你的 memcached 键中获取值。
http://php.net/manual/en/book.memcached.php
如果你的原始 ajax 将请求放入数据库中,然后启动脚本,你仍然有时间(假设请求需要一些时间才能完成(将后续任务放入同一数据库中,由仍在运行的脚本拾取。
至于报告它,也许运行一个快速的jquery以查看队列中有多少项目?或者让任务.php文件更新数据库(甚至可能是另一个表(,以说明它已完成的作业数以及当前仍在队列中的作业数。
如果你不需要向PHP脚本发送太多数据,你可以使用"长轮询"方法。这样,您就不会使用 AJAX,而是插入如下所示的脚本标记:
<script src="my_php_script?task1=x¶m_t1_1=42&task2=y"></script>
然后,PHP 文件可以发回一个 JavaScript 命令,例如
updatePercent(12);
完成每项任务后。每当这些命令进入时,浏览器都应执行这些命令。请务必在每次任务后致电flush
。
研究 Comet 可能会为您提供有关如何处理客户端-服务器连接的其他想法。
您可以管理队列 - 在发送 AJAX 请求之前 - 将任务放入队列(可以是对象或数组(。使用complete
函数异步运行 AJAX,该函数将在完成后从队列中删除作业。您可以更新进度以及从队列中删除作业或使用setTimeout()
单独处理它,这将检查队列中有多少任务以及总共有多少任务放入队列:% = (submitted_tasks - items_in_queue(/submitted_tasks * 100