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

标签 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。

请帮忙。

最佳答案

最后问题解决了,主要是session lock问题。

你需要有回调函数来处理 session 关闭以及写入接收到的数据,

回调函数:

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

关于php - 如果正在进行流式下载,Nginx PHP-FPM 不提供请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38202275/

相关文章:

ubuntu - nginx 将非 www 重定向到 www 和 https

php - 更改我的帐户页面内的 woocommerce 订阅 "shop"链接

php - 如何在 linux 上的 php 中启用 --enable-soap?

php - 为什么 cUrl 无法通过 HTTPS 下载,除非 CURLOPT_SSL_VERIFYPEER 设置为 "false"?

api - 使用 API (2.5.1) 将容器上传到注册表 V2

linux - 如何从curl响应中获取某些JSON值

node.js - 将 websocket 与 Elastic beanstalk、nginx 和 node.js 结合使用时出现问题

php - 隐写术是如何在php中实现的

php - 同时修改mysql数据库中的多行

nginx - Playframework Websocket 的 VHosts Nginx 配置