终止与jQuery AJAX请求的连接,继续在服务器端处理php?

时间:2012-07-20 16:13:37

标签: php jquery ajax

我有一个注册表单,它调用可以与我们的CRM API进行交互的PHP脚本,如下所示:

CRM API< - > PHP脚本< - >注册表单

  1. 注册表单将一些信息传递给PHP脚本 AJAX致电
  2. PHP脚本运行十几个API调用以创建CRM 帐户并附上各种数据
  3. CRM将刚刚创建的新帐户ID返回给PHP脚本
  4. PHP脚本将帐户ID传递回注册表单,此时AJAX调用已完成,注册表单可以继续。
  5. 问题是#2,这十几个调用需要大约20秒才能完成,但是注册表单需要的数据是在第一次API调用之后生成的,因此它理论上可以更快地返回该数据并执行其余的操作服务器端没有持有AJAX呼叫打开的全部时间。

    我尝试了flush()和ob_flush(),它在处理完成之前向客户端输出帐号id,但是jQuery AJAX连接仍然打开,所以我仍然等待在注册表单端关闭连接在发生任何事情之前。

    那么,尽可能快地将该帐户ID返回到表单的最简单方法是什么?

    也许使用curl和exec爆发?

     if(signing up){
          stuff
          exec(curl myself, notsignup)
     }
     else {
          bunch of api calls
     }
    

2 个答案:

答案 0 :(得分:1)

如果您只需要第一次API调用的信息来返回表单,那么我可能会尝试不同的工作流程:

  1. 表单调用PHP脚本
  2. PHP调用第一个API调用
  3. PHP返回表单
  4. 表单处理响应
  5. 表单调用第二个PHP脚本以完成该过程
  6. PHP完成API调用(此时表单可能会放弃,因为它听起来好像你不关心从这里发生的事情)。
  7. 工作流程需要为开发人员提供更多的工作和协调,但为用户提供响应最快的界面。

答案 1 :(得分:1)

您应该考虑为所需的其余步骤创建单独的流程。一种方法是你可以在#1首次api呼叫完成后完成。它会回复用户,并且不会尝试完成用户端的其余20个呼叫。

然后创建一个完成剩下部分的队列。您总是可以在mysql中创建一个表来存储队列。

接下来只需创建一个将在后台运行的cronjob,将队列排除在外。

注意:你不会希望这个cronjob只是启动而且永远不会停止。也许让它每5分钟运行一次,但在它开始运行之前,检查另一个cron是否还在进行中。如果是,那么它将在另外5分钟检查以确定是否可以运行。

希望这有帮助!