如果流下载正在进行,Nginx PHP-FPM不服务请求


Nginx PHP-FPM not serve request if streaming download in progress

在Nginx上安装了两个应用程序,一个是PHP,另一个是Python。

基于Python的应用程序是使用uwsgi部署在Nginx上的REST API应用程序。一个API提供CSV下载服务。CSV文件大多大于100mb,所以API提供流媒体下载。 在同一个Nginx上使用PHP -fpm的PHP应用程序消耗REST API。在CSV下载的情况下,PHP应用程序向API发出请求,并提供流下载,以进一步流下载到用户/浏览器。

现在的问题是,当下载请求正在从PHP应用程序,并试图使访问PHP应用程序的其他页面,然后它不加载(响应)页面。如果我取消下载请求,那么它会立即加载/响应页面。

在API中,如果下载流正在进行,其他API请求响应工作,因此python应用程序没有问题。

但是对于PHP应用程序,它不起作用。尝试了不同的选项,如在Nginx中更改worker_processes, worker_connections。还有php-fpm中的池管理器配置。没有成功。

从PHP应用程序请求REST API,我使用了PHP curl,即curl。

请帮。

最后问题解决了,主要是会话锁问题

你需要有回调函数来处理会话关闭,也写收到的数据,

回调函数:

function curlWriteHandler($ch, $data)
    {
        echo $data;
        session_write_close();
        return strlen($data);
}

,设置callback为

curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'curlWriteHandler');

从以下答案中得到参考/链接(我不知道在答案中指定链接是否好,仍然)

在PHP's cURL中使用CURLOPT_WRITEFUNCTION是为了什么?

CURL下载文件时如何使用CURLOPT_WRITEFUNCTION

,https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html