我是PHP Web应用程序的作者,该应用程序为其用户的环境提供仪表板和控制面板。
对于上下文,架构大致如下:
当用户登录Web应用程序时,他们的环境将从数据库中加载并显示。用户界面保持最新状态,AJAX轮询请求到PHP服务器。我通过将连接状态保存在JS布尔值中来将这些请求绑定到不“堆栈”,这样无论何时触发轮询间隔,后续请求都不会“堆叠”。即,在活动请求完成之前,将跳过后续请求。
除了轮询以使接口保持最新外,还可以通过AJAX请求将SOAP服务用于PHP服务器,从服务器触发对NBI的同步SOAPClient请求,以执行影响用户环境的操作。当对这些请求进行更改时,解析系统最终会获取更改并更新数据库,从而导致轮询机制更新接口,从用户的角度完成操作。
执行NBI调用的用户启动的AJAX请求可能会持续大量时间,有时甚至超过SOAP请求发布前一分钟,并且SOAP请求的操作的状态将返回给AJAX请求引发了它。
在用户的GUI中,我正在锁定其他AJAX请求(包括民意调查),而其中一个操作正在进行中,确保一次只有一个AJAX请求处于活动状态。
问题出在此处:如果此请求被xhr.abort()取消,则对NBI呼叫的服务器端请求将保持打开状态,直到完成为止。当完成处于待处理状态时,如果用户尝试在其他地方导航或执行其他操作(或轮询),则请求将被保留,直到服务器完成原始取消的请求。
要明确:保持似乎是SERVER-SIDE,因为浏览器中没有正在进行的并发AJAX或其他请求限制。
在服务器完成由中止的AJAX请求触发的SOAP客户端请求之前,来自同一浏览器的进一步请求似乎在服务器处被阻止。
据我所知,在流中杀死AJAX请求并不会终止服务器上的请求,但是为什么服务器会在触发NBI调用的AJAX请求中止后才会阻止进一步的请求?