Javascript正在获得PHP脚本的进展

时间:2012-09-21 19:11:45

标签: php javascript ajax

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

6 个答案:

答案 0 :(得分:2)

如果您让执行处理的脚本在一段时间内将其状态写入文件,该怎么办?制作第二个脚本,读取文件并返回原始文件的状态。

答案 1 :(得分:2)

  1. Ajax调用php脚本并返回脚本运行的信息。
  2. 主脚本创建lock.file。
  3. 从cron调用的脚本正在检查lock.file是否存在并运行正确的脚本。
  4. 正确的脚本将当前进度保存到progress.txt。
  5. Ajax正在读取progress.txt,当进度为100%时,则返回脚本处理完成的信息。
  6. 编辑:感谢Justin因超时问题而停止;)

答案 2 :(得分:2)

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

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

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

请参阅:Dealing with long server-side operations using ajax?

答案 3 :(得分:1)

如果你想要非常喜欢,可以将php脚本的输出写入stdout,然后通过管道捕获它。这将需要使用exec()或proc_open()(http://php.net/manual/en/function.proc-open.php)运行php脚本并将输出传递给文件(或者如果你想成为额外的花哨,使用node.JS来监听那些数据)

有很多方法可以实现这一目标:

  • Node.js的
  • 每隔x秒进行一次Ajax查询
  • 重新加载META / Javascript页面
  • 正常重新加载状态的iframe。
祝你好运!

答案 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发出请求,接收号码并将其提供给您的进度条......

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