【问题标题】:Javascript getting progress of PHP-scriptJavascript 取得 PHP 脚本的进展
【发布时间】:2012-09-21 19:11:45
【问题描述】:

我需要提供 html-page 上的 js 和 php-script 之间的交互。
- 使用 AJAX。
好的。但问题是 php-script 执行了很长时间,我需要知道这个脚本处理的状态(例如 60% 完成)
我该怎么办?创建 2 个 php 脚本(客户端和服务器)并对 client.php 执行 ajax-request,这将通过套接字或 smth 向 server.php 发出请求? 还有更优雅的解决方案吗?

【问题讨论】:

  • 嗯,使用文件可以提供帮助,但这仍然不是我的梦想。如果我需要经常从 php-script 获取信息怎么办。这对文件系统来说会不会太贵?
  • 读取文件对计算机来说非常容易。

标签: php javascript ajax


【解决方案1】:

如果您让执行处理的脚本偶尔将其状态写入文件会怎样。编写第二个脚本来读取文件并返回原始文件的状态。

【讨论】:

    【解决方案2】:

    你不应该让一个长时间运行的进程完全在一个 HTTP 会话中执行。

    解决这个问题的一个简单而常见的方法是消息队列。基本上,您让您的 UI 将请求排队到数据库表中,然后让外部守护进程处理该队列。

    要提供反馈,请让守护程序定期更新表格,使其包含当前正在处理的行的状态。然后,您的 javascript 代码可以向脚本发出 AJAX 请求,该脚本从数据库中检索该工作项的状态并将其显示给用户。

    见:Dealing with long server-side operations using ajax?

    【讨论】:

      【解决方案3】:
      1. Ajax 调用 php 脚本并返回该脚本正在运行的信息。
      2. 主脚本创建 lock.file。
      3. 从 cron 调用的脚本正在检查 lock.file 是否存在并运行正确的脚本。
      4. 正确的脚本将当前进度保存到progress.txt中。
      5. Ajax 正在读取 progress.txt,当进度为 100% 时,返回脚本处理完成的信息。

      已编辑:感谢贾斯汀指出超时问题;)

      【讨论】:

      • 即使您在主脚本中fork() 在后台进行处理,如果请求长时间运行,您的 HTTP 服务器仍然可以中止请求。有一些方法可以解决这个问题,但更好的解决方案是将耗时的过程完全移到 Web 服务器的职责范围之外。
      • 当然可以,但是主脚本而不是处理操作只能创建一个锁定文件,然后在锁定文件存在时从 cron 运行的另一个脚本可以运行主进程。从 cli 调用的脚本通常没有任何超时:)
      • 您可能应该更新答案以包含它。目前的措辞方式(“主脚本将进度写入progress.txt文件”)并没有明确表明“主脚本”正在由cron执行并寻找开始处理的信号.
      • 如何衡量这种方法的进度状态? (比如服务器正在处理多少百分比等)
      【解决方案4】:

      如果你想真正花哨,请将 php 脚本的输出写入标准输出,并通过管道捕获它。这将需要使用 exec() 或 proc_open() (http://php.net/manual/en/function.proc-open.php) 运行 php 脚本并将输出通过管道传输到文件中(或者如果你想额外花哨,使用 node.JS 来监听该数据)

      有很多方法可以做到这一点:

      • Node.JS
      • 每 x 秒执行一次 Ajax 查询
      • 重新加载 META/Javascript 页面
      • 一个 iframe 定期重新加载其中的状态。

      祝你好运!

      【讨论】:

        【解决方案5】:

        您可以使用 PHP 的输出缓冲(请参阅 ob_flush)来刷新脚本中某些点的内容,并调整您的 JavaScript 以便它使用刷新的内容。我相信您的 AJAX 调用中的 readyState 在刷新时不会设置为 4,因此您必须自己处理(请参阅this article)。我认为它比写入文件并检查其内容要好得多。

        【讨论】:

          【解决方案6】:

          在你的process.php

          // 1st task
          $_SESSION['progress'] = 0;
          
          // your code for the first task here ...
          
          // 2nd task
          $_SESSION['progress'] = 10;
          
          // you code for 2nd task ...
          
          // 3rd task
          $_SESSION['progress'] = 17;
          
          // continue ...
          
          // everything finished?
          $_SESSION['progress'] = 100;
          

          在您的progress.php

          // simply output
          echo $_SESSION['progress'];
          

          现在从您的客户端,只需向您的progress.php 发出请求,接收号码并将其提供给您的进度条...

          没有自己检查,但希望它有效! :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-09-21
            • 2013-04-23
            • 2012-05-11
            • 2011-04-28
            • 2015-08-18
            • 2015-08-06
            • 1970-01-01
            相关资源
            最近更新 更多