多个ajax同时请求,会不会出现阻塞

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个ajax同时请求,会不会出现阻塞相关的知识,希望对你有一定的参考价值。

参考技术A 不会的,tomcat可以处理高并发的,每一次请求都是一个线程 参考技术B 自动线程提交了。除非你几百分万次一起请求把服务器挤崩了

对 PHP 的非阻塞 Ajax 请求

【中文标题】对 PHP 的非阻塞 Ajax 请求【英文标题】:Non blocking Ajax request to PHP 【发布时间】:2014-04-12 11:42:19 【问题描述】:

我正在使用 PHP 从远程服务器下载(大)文件,此下载是通过单击网页上的下载按钮触发的。

因此,当我单击网页上的 download 按钮时,会向 PHP 函数发出 Ajax 请求(带有角度 $http)。该函数使用cURL 触发下载。

与此同时,我想使用 Ajax 向我的 PHP 站点发出其他请求。但只要下载正在进行,所有其他 Ajax 请求都会显示状态 Pending

所以基本上下载会阻止对 PHP 的所有其他请求。有什么办法可以避免这种堵塞?

【问题讨论】:

您是否在 ajax 请求中使用async: true 【参考方案1】:

这很可能是由于会话文件被锁定。这是许多基于 php 的 web 应用程序的一个非常常见的疏忽。本质上,当您调用session_start() 访问$_SESSION 数组时,它会以读/写模式打开tmp 目录中的会话文件并锁定该文件以避免潜在的并发问题。如果您从不同的 ajax 请求(或任何 HTTP 请求,例如从新的浏览器窗口)调用另一个脚本,如果第二个请求也调用 session_start,它将等到会话文件解锁后再继续。

解决方法是在您知道不再写入会话文件后释放会话文件。由于您的用例是一个巨大的文件下载,因此在数据输出期间您不太可能需要将任何内容推送到 $_SESSION 数组中。您可以通过调用 session_write_close() 将其从写入模式中释放出来

直到我发现一个我经常使用的流行网络应用程序犯了这个罪,我才知道情况会这样。关于这个常见瓶颈的一篇很棒的博文是:

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

【讨论】:

这也可能是由于服务器允许的来自单个主机的最大同时连接数。任何超过最大值的连接通常会保持活动状态,但在插槽释放之前不会被服务器处理。 非常感谢!这似乎是问题所在。我通过从我的应用程序中删除 session_start() 对其进行了测试。现在可以在文件下载时发出多个请求。

以上是关于多个ajax同时请求,会不会出现阻塞的主要内容,如果未能解决你的问题,请参考以下文章

随手记一 2018/04/23 Ajax基础了解

jQuery同步Ajax带来的UI线程阻塞问题及解决办法

java并发编程11.原子变量与非阻塞同步机制

java同异步请求和阻塞非阻塞的区别

轮询,长轮询,websocket原理

队头阻塞