我正在使用PHP从远程服务器下载(大)文件,点击网页上的下载按钮即可触发此下载。
因此,当我单击网页上的download
按钮时,会向PHP函数发出Ajax
请求(带有角度$http
)。该功能使用cURL
触发下载。
与此同时,我想用Ajax向我的PHP站点发出其他请求。但只要下载正在进行,所有其他Ajax请求都会显示状态Pending
。
所以基本上下载阻止了对PHP的所有其他请求。有什么办法可以避免这种堵塞吗?
答案 0 :(得分:10)
这很可能是由于会话文件被锁定。这是许多基于php的网络应用程序的一个非常常见的疏忽。实质上,当您调用session_start()
来访问$_SESSION
数组时,它会以读/写模式打开tmp目录中的会话文件并锁定此文件以避免潜在的并发问题。如果您从另一个ajax请求(或任何HTTP请求,例如来自新浏览器窗口)调用另一个脚本,如果该第二个请求也调用session_start
,它将等待会话文件解锁,然后再继续。
修复是在您知道不再写入会话文件后释放会话文件。由于您的用例是一个巨大的文件下载,因此在数据输出期间您不太可能需要将任何内容推送到$_SESSION
数组中。您可以通过调用session_write_close()
我不知道是这种情况,直到我发现一个我经常使用的流行的网络应用程序是犯了这个。关于这个常见瓶颈的一篇很棒的博客文章是:
http://konrness.com/php5/how-to-prevent-blocking-php-requests/