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


Terminate connection to jQuery AJAX request, keep processing php on server side?

我有一个注册表单,它调用了一个PHP脚本,可以与我们的CRM的API交互,比如:

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

  1. 注册表单将一些信息传递给PHP脚本AJAX调用
  2. PHP脚本运行了十几个对CRM的API调用,以创建帐户并附加各种数据
  3. CRM将刚刚创建的新帐户id返回到PHP脚本
  4. PHP脚本将帐户id传递回注册表单,此时AJAX调用完成,注册表单可以继续

问题是#2,这十几个调用需要大约20秒才能完成,但注册表单所需的数据是在第一次API调用后生成的,因此理论上它可以更快地返回数据,并在服务器端完成其余的工作,而无需一直打开AJAX调用。

我尝试了flush()和ob_flush(),它们在处理完成之前向客户端输出帐户id,但jQueryAJAX连接仍然打开,所以我仍然在等待注册表单端的连接关闭,然后再进行任何操作。

那么,尽快将帐户id返回到表单的最简单方法是什么?

也许用curl和exec来爆发?

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

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

然后创建一个队列来完成剩下的工作。你可以在mysql中创建一个表来存储队列。

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

注意:您不希望这个cronjob只是启动而从未停止。也许每5分钟运行一次,但在开始运行之前,请检查另一个cron是否仍在进行中。如果是,它将在5分钟后检查是否可以运行。

希望这能有所帮助!

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

  1. 表单调用PHP脚本
  2. PHP调用第一个API调用
  3. PHP返回表单
  4. 表单流程响应
  5. Form调用第二个PHP脚本来完成该过程
  6. PHP完成API调用(此时表单可以放弃,因为听起来你不在乎以后会发生什么)

工作流程需要开发人员做更多的工作和协调,但为用户提供了最具响应性的界面。