我需要在 html-page 和 php-script 上提供 js 之间的交互。
- 使用 AJAX。
好的。但问题是 php-script 执行了很长时间,我需要知道这个脚本处理的状态(例如 60% 完成)
我该怎么办?创建 2 个 php 脚本(客户端和服务器)并对 client.php 执行 ajax-request,这将通过套接字或其他方式向 server.php 发出请求?有更优雅的解决方案吗?
问问题
1504 次
6 回答
2
- Ajax 调用 php 脚本并返回该脚本正在运行的信息。
- 主脚本创建 lock.file。
- 从 cron 调用的脚本正在检查 lock.file 是否存在并运行正确的脚本。
- 正确的脚本将当前进度保存到 progress.txt 中。
- Ajax 正在读取 progress.txt,当进度为 100% 时返回脚本处理完成的信息。
编辑:感谢贾斯汀指出超时问题;)
于 2012-09-21T19:14:59.637 回答
2
如果您让执行处理的脚本偶尔将其状态写入文件会怎样。制作第二个脚本,它将读取文件并返回原始文件的状态。
于 2012-09-21T19:13:16.873 回答
2
您永远不应该在 HTTP 会话中完全执行长时间运行的进程。
解决这个问题的一个简单而常见的方法是消息队列。基本上,您让您的 UI 将请求排队到数据库表中,然后让外部守护进程处理该队列。
要提供反馈,请让守护程序定期用它当前正在处理的行的状态更新表。然后,您的 javascript 代码可以向脚本发出 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 回答