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

时间:2016-07-05 11:26:38

标签: php curl nginx fastcgi

在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。

请帮忙。

1 个答案:

答案 0 :(得分: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