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