0

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

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

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

问题是 #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
 }
4

2 回答 2

1

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

然后创建一个队列来完成其余的工作。您总是可以在 mysql 中创建一个表来存储队列。

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

注意:您不会希望这个 cronjob 只是启动并且永不停止。也许让它每 5 分钟运行一次,但在它开始运行之前,请检查是否有另一个 cron 仍在进行中。如果是,那么它将再检查 5 分钟以查看是否可以运行。

希望这可以帮助!

于 2012-07-20T16:28:09.337 回答
1

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

  1. 表单调用 PHP 脚本
  2. PHP 调用第一个 API 调用
  3. PHP 返回表单
  4. 表单处理响应
  5. 表单调用第二个 PHP 脚本来完成该过程
  6. PHP 完成 API 调用(此时表单可以放弃,因为听起来您不关心从现在开始会发生什么)。

工作流程需要开发人员进行更多的工作和协调,但会向用户提供响应最快的界面。

于 2012-07-20T16:19:40.497 回答