一尘不染

非阻塞对PHP的Ajax请求

ajax

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

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

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

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


阅读 256

收藏
2020-07-26

共1个答案

一尘不染

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

解决方法是在知道不再要写入会话文件时释放会话文件。由于用例是大量文件下载,因此在数据输出期间不太可能需要将任何内容推入$_SESSION阵列。您可以通过调用从写模式释放它session_write_close()

我不知道这是事实,直到我发现经常使用的流行网络应用程序对此感到内gui。关于此常见瓶颈的出色博客文章是:

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

2020-07-26