【问题标题】:Ajax - Communicating with running PHP script in background?Ajax - 与在后台运行的 PHP 脚本通信?
【发布时间】:2012-07-30 10:38:24
【问题描述】:

我怀疑这个问题看起来太……愚蠢,但我正在努力寻找一个不错的解决方案,但我有点卡住了。

所以,这是我的情况:

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

我想要做什么:

  • 我不想运行 3-4 个不同的任务(= 3-4 个通过 Ajax 异步调用的不同 PHP 脚本),我希望只运行 1 个(= 1 个脚本) - 换句话说,组合 X 脚本合而为一。 (这很简单)。

我面临的问题:

  • 如何仍能报告完成百分比(X 个任务中的 1 个)?

有什么想法吗?

【问题讨论】:

    标签: php jquery ajax codeigniter


    【解决方案1】:

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

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

    【讨论】:

    • 嗯...这似乎是一个有趣的解决方法。我会调查一下。谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 嗯...我想到了类似的东西-仅使用文件作为队列持有者...无论如何我可能会尝试...谢谢您的想法!跨度>
    【解决方案3】:

    如果您不需要向 PHP 脚本发送太多数据,可以使用“long poll”方法。有了这个,你就不用 AJAX,而是像这样插入一个脚本标签:

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

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

    updatePercent(12);
    

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • Pavel,这就是我目前正在做的事情;我想要的是 1 个 ajax 请求 = 1 个任务 = 1 个 php 脚本(执行多个操作,但仍报告子例程的进度)
      • 我认为您无法使用 1 个脚本监控进度,因为您需要知道已经完成了多少工作 - 您无法在 PHP 脚本中执行此操作,因为 ECHO 会终止请求。监控脚本将被调用以确定已完成的工作量,例如相对于作业总量,数据库中有多少行被更新/插入/删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多