我需要在html-page和php-script之间提供js之间的交互
- 使用AJAX
好。但问题是php脚本执行了很长时间,我需要知道这个脚本处理的状态(例如60%完成)
我该怎么办?创建2个php脚本(客户端和服务器)并对client.php执行ajax请求,它将通过套接字或smth向server.php发出请求?
有更优雅的解决方案吗?
答案 0 :(得分:2)
如果您让执行处理的脚本在一段时间内将其状态写入文件,该怎么办?制作第二个脚本,读取文件并返回原始文件的状态。
答案 1 :(得分:2)
编辑:感谢Justin因超时问题而停止;)
答案 2 :(得分:2)
您永远不应该在HTTP会话中完全执行长时间运行的进程。
解决此问题的一种简单而常见的方法是消息队列。基本上,您将UI请求排队到数据库表中,然后让外部守护程序处理队列。
要提供反馈,请让守护程序定期使用当前正在处理的行的状态更新表。然后,您的javascript代码可以向脚本发出AJAX请求,该脚本从数据库中检索该工作项的状态并将其显示给用户。
答案 3 :(得分:1)
如果你想要非常喜欢,可以将php脚本的输出写入stdout,然后通过管道捕获它。这将需要使用exec()或proc_open()(http://php.net/manual/en/function.proc-open.php)运行php脚本并将输出传递给文件(或者如果你想成为额外的花哨,使用node.JS来监听那些数据)
有很多方法可以实现这一目标:
答案 4 :(得分:0)
您可以使用PHP的输出缓冲(请参阅ob_flush)来刷新脚本中某些点的内容,并定制JavaScript以使其使用刷新的内容。我相信你的AJAX调用中的readyState在刷新时不会被设置为4,所以你必须自己处理它(参见this article)。我认为它比写入文件和检查文件的内容要好得多。
答案 5 :(得分: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
发出请求,接收号码并将其提供给您的进度条......
没有自己检查,但希望它有效! :)