6

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

4

6 回答 6

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

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

于 2012-09-21T19:14:59.637 回答
2

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

于 2012-09-21T19:13:16.873 回答
2

您永远不应该在 HTTP 会话中完全执行长时间运行的进程。

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

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

请参阅:使用 ajax 处理较长的服务器端操作?

于 2012-09-21T19:24:36.563 回答
1

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

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

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

祝你好运!

于 2012-09-21T19:21:59.213 回答
0

在你的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,接收号码并将其提供给您的进度条...

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

于 2012-09-21T19:46:46.887 回答
0

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

于 2012-09-21T19:25:23.810 回答