如果正在进行流式下载,Nginx PHP-FPM无法提供请求

问题描述 投票:3回答:1

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

基于Python的应用程序是使用uwsgi在Nginx上部署的REST API应用程序。一个API提供CSV下载。 CSV文件大多数大于100 MB。因此API提供流式下载。

使用php-fpm在同一个Nginx上托管的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。

请帮忙。

php curl nginx fastcgi
1个回答
1
投票

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

您需要具有回调函数来处理会话关闭以及写入接收的数据,

回调函数:

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

&设置回调为,

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

从以下答案/链接获得参考(我不知道在答案中指定链接的好主意,仍然)

What for do we use CURLOPT_WRITEFUNCTION in PHP's cURL?

How use CURLOPT_WRITEFUNCTION when download a file by CURL

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

© www.soinside.com 2019 - 2024. All rights reserved.