诡异的报错 cURL error 18: transfer closed with outstanding read data rem

背景:公司新项目用的laravel框架,初期无专门的运维,用guzzle封装的get/post的对外请求方法,请求某个接口的时候,每页条数per_page超过一定数就会报错

GuzzleHttp\Exception\RequestException: cURL error 18: transfer closed with outstanding read data remaining (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

用postman直接请求会返回数据,但是数据不能自动美化格式,用curl方法请求会返回数据+报错信息。

 

解决方法:

(只针对此次遇到的问题的解决方法,同样的报错可能是不同的原因引起)

服务器nginx,fpm都是用www用户运行的,设置nginx用户为www,统一lnmp体系的权限配置:

chown -R www.www /var/lib/nginx/

解决过程:

看报错信息提示

http://curl.haxx.se/libcurl/c/libcurl-errors.html

CURLE_PARTIAL_FILE (18)
A file transfer was shorter or larger than expected. This happens when the server first reports an expected transfer size, and then delivers data that doesn't match the previously given size.
传的数据和预期的数据大小不一致,,,

开始只是在项目里用封装的方法请求看的报错,用postman看有返回数据,因此最初一直以为是guzzle封装的方法有问题,传的请求header不对,花了大量时间测试http头信息http1.1的keep-alive、content-length、Transfer-Encoding: chunked 等属性,最后无果。

后来仔细直接用curl命令请求接口,同样发现里错误信息,这才把注意力放在服务器端的配置上,先是估计可能是nginx或者fpm最大传输数据量的配置过小,但返回数据最多也没超过100k,不应该超过配置大小,

然后在百度搜“PHP nginx http 接口返回内容最大值”

https://blog.csdn.net/sakurallj/article/details/51822828
http://www.dewen.net.cn/q/1913

如果PHP返回的内容过大,nginx会把一部分内容先存到文本文件/var/lib/nginx/tmp/fastcgi中,等全部内容都接收完毕后,再一并发送到客户端。但是nginx的执行用户没有nginx下tmp文件的写权限。

这才去看了下nginx的error_log发现确实有报错信息。之后统一了lnmp的用户角色,解决了问题。。。。

2018/12/13 18:41:31 [crit] 30392#0: *380874 open() "/var/lib/nginx/tmp/fastcgi/3/43/0000000433" failed (13: Permission denied) while reading upstream, client: 182.18.28.66, server: , request: "GET /v1/user/list?page=1&perpage=50 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "123.123.123.13:11008”

posted @ 2022-04-19 11:09  Vitascope  阅读(2393)  评论(0编辑  收藏  举报