0

我是一个 PHP Web 应用程序的作者,该应用程序为其用户环境提供仪表板和控制面板。

对于上下文,架构大致如下:

  • apache webserver w/ PHP 5.4 处理用户界面请求
  • MYSQL 5.5 (percona) 存储有关用户环境的数据
  • 由独立系统托管的 SOAP 服务,允许北向接口 (NBI) 请求影响用户环境
  • 一个单独的解析系统,它解释用户环境的变化并根据检测到的变化更新数据库。

当用户登录到 Web 应用程序时,他们的环境会从数据库中加载并显示出来。用户界面与 PHP 服务器的 AJAX 轮询请求保持最新。通过将连接状态存储在 JS 布尔值中,我已经将这些请求设置为不“堆叠”,这样每当触发轮询间隔时,后续请求就不会“堆叠”。即跳过后续请求,直到活动请求完成。

除了轮询以保持接口最新,SOAP 服务还可以通过 AJAX 请求向 PHP 服务器使用,触发服务器向 NBI 的同步 SOAPClient 请求,以执行影响用户环境的操作。当对这些请求进行更改时,解析系统最终会拾取更改,并更新数据库,使轮询机制更新接口,从用户的角度完成操作。

执行 NBI 调用的用户发起的 AJAX 请求可能会持续相当长的时间,有时甚至会在 SOAP 请求被释放之前超过一分钟,并且 SOAP 请求的操作的状态会返回给触发它的 AJAX 请求。

在用户的 GUI 中,我锁定了其他 AJAX 请求(包括轮询),同时这些操作之一正在进行,确保一次只有一个 AJAX 请求处于活动状态。

问题在于:如果此请求被 xhr.abort() 取消,则对 NBI 调用的服务器端请求将保持打开状态,直到完成。当完成等待时,如果用户试图导航到其他地方或执行另一个操作(或轮询),请求将被暂停,直到服务器完成原始取消的请求。

需要明确的是:暂停似乎是服务器端,因为没有正在进行的并发 AJAX 或在浏览器中受到其他请求限制。

在服务器完成由中止的 AJAX 请求触发的 SOAP 客户端请求之前,来自同一浏览器的进一步请求似乎在服务器上被阻止。

我知道终止 AJAX 请求中间流不会终止服务器上的请求,但是为什么服务器会阻止进一步的请求,直到触发 NBI 调用的 AJAX 请求被中止之后?

4

0 回答 0