2012-05-14 43 views
0

我有一个脚本,需要大约5分钟才能执行并完成。一切都发生在一个PHP页面(包括,但没有AJAX或任何东西)。脚本完成后,您会通过电子邮件发送文件。输出异步脚本的状态

我希望前端只需接受表单提交并在幕后做这件事,同时通过推送信息,如果窗口保持打开状态。

所以,举例来说,这里将是流量:

  1. 填写表格并提交。
  2. 确认表单已提交 - 可自由关闭窗口。
  3. 如果窗口仍然开放,给“里程碑”更新
    1. 查询完成
    2. 文件生成
    3. 电子邮件发送

我们的目标是提供在用户等待信息为它,但窗体提交后立即关闭窗口是完全可以接受的,并且电子邮件仍然会被接收。我知道我可以通过AJAX提交表单,但我怎样才能回传临时流程完成,而不仅仅是成功回调?

+0

我有一个类似的系统使用coldfusion和cfflush与iframe实现。当每个里程碑完成后,我会向iframe提供一个脚本标记,用于向父页面发送一些内容以指示进度。 –

回答

1

您必须让客户端(浏览器)定期轮询服务器以获取更新。例如,你可能有类似以下内容:

function checkStatus() { 
    $.ajax({ 
     url: "/CheckStatus", // your AJAX handler, on the server 
     success: function(data) { 
      $('#status').text(data); 
      if(data != 'Email sent') 
       setTimeout(checkStatus(), 100); 
     } 
    }); 
} 

然后,你的表格提交后,只需拨打checkStatus

0

您应该将服务器端逻辑分隔成可以从命令行运行的脚本。假设您在Linux上,您将使用php exec()函数在您的服务器上启动一个后台进程,该进程使用php命令行程序运行脚本。

然后,您将浏览器代码定期轮询服务器以获取更新。