php guzzle [curl] 52 来自服务器的空回复

Posted

技术标签:

【中文标题】php guzzle [curl] 52 来自服务器的空回复【英文标题】:php guzzle [curl] 52 Empty reply from server 【发布时间】:2015-11-05 05:09:22 【问题描述】:

我正在发出以下请求,导致服务器回复空。

Originate server : AWS ec2 / php 5.4 / Guzzle 
Remote server : AWS ec2 through elb 
CURL info :
  "url":"https:\/\/xxx\/xxx",
  "content_type":null,
  "http_code":0,
  "header_size":0,
  "request_size":5292,
  "filetime":-1,
  "ssl_verify_result":0,
  "redirect_count":0,
  "total_time":120.987057,
  "namelookup_time":0.000277,
  "connect_time":0.001504,
  "pretransfer_time":0.014271,
  "size_upload":2430,
  "size_download":0,
  "speed_download":0,
  "speed_upload":20,
  "download_content_length":-1,
  "upload_content_length":2430,
  "starttransfer_time":60.998147,
  "redirect_time":59.988895,
  "certinfo":[],
  "primary_ip":"54.169.126.111",
  "primary_port":443,
  "local_ip":"192.168.2.111",
  "local_port":39522,
  "redirect_url":""
 

CURL error : [curl] 52: Empty reply from server [url] https:\/\/xxx\/xxx

请注意,这并不总是发生。

似乎请求甚至没有到达目的地(elb),因为没有与请求相关的日志 1. 是源服务器还是远程服务器的问题? 2. "starttransfer_time":60.998147 这可能是根本原因吗?

欢迎提出解决方案、解决方法和建议。谢谢!

【问题讨论】:

您多久收到一次失败?是否可以单独连接到 ELB 后面的所有节点以测试连通性?根据您提供的信息,我觉得这像是间歇性的网络问题。 我们每分钟收到大约 6000 个请求,大约 40-50 个请求失败。所有这些失败的请求都转移到后台进程进行重试,最终成功。我们没有注意到 cpu 或源集群或远程集群中的内存。 elb 访问日志上没有 4XX / 5XX 的迹象。 【参考方案1】:

似乎请求从未到达服务器, 检查网络错误。任何 TCP 重新传输/超时或任何错误。正如您提到的,没有回复意味着它是 TCP 超时吗? 运行 tcpdump 并根据您的决定分析跟踪。

此外,您可以在原始服务器和远程服务器的两个应用程序中启用日志级别。 检查错误模式,例如:是因为负载高吗?

【讨论】:

【参考方案2】:

在我的情况下,“来自服务器的空答案”是由远程服务器上的内存耗尽引起的。在这种情况下,会引发致命错误并终止请求。

使用curl_setopt($h, CURLOPT_VERBOSE, true); 调试 cURL 没有帮助,因为只有“连接已终止,正在重试新连接”,然后是“来自服务器的空回复”。我们必须在远程服务器端调试它。

【讨论】:

以上是关于php guzzle [curl] 52 来自服务器的空回复的主要内容,如果未能解决你的问题,请参考以下文章

什么是 curl 错误 52“来自服务器的空回复”?

如何使用Curl将这个mailchimp API请求转换为使用PHP的Guzzle?

将此 cURL 转换为 Guzzle

将 Curl 客户端 ssl 移动到 Guzzle

将 JSON 转换为 guzzle php 库请求

在 Guzzle 中设置代理