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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果正在进行流式下载,Nginx PHP-FPM无法提供请求相关的知识,希望对你有一定的参考价值。

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。

请帮忙。

答案

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

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

回调函数:

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

以上是关于如果正在进行流式下载,Nginx PHP-FPM无法提供请求的主要内容,如果未能解决你的问题,请参考以下文章

nginx/php-fpm 访问php文件直接下载而不运行

docker创建nginx+php-fpm环境

Nginx 和 PHP-FPM - 权限被拒绝 - Windows

Nginx + php-fpm下载php文件而不执行[重复]

升级到php8.0后,nginx仍然使用php7.2进行PHP-FPM

开机自启动nginx,php-fpm