PHP7.2 CURL请求无法完成,未使用HTTP2协议且头部异常问题咨询
问题解答
1. PHP cURL未发起HTTP/2请求的原因
PHP cURL扩展默认不会主动启用HTTP/2协商:
- 终端新版curl默认会在HTTPS请求时自动尝试协商HTTP/2协议,但PHP cURL的默认
CURLOPT_HTTP_VERSION参数值为CURL_HTTP_VERSION_NONE,该模式下最高仅会使用HTTP/1.1协议,不会主动发起HTTP/2协商。 - 要启用HTTP/2支持,需要同时满足两个前提:系统安装的libcurl版本≥7.33.0,且编译时已开启nghttp2依赖支持;PHP版本≥7.0。
修复方式是在代码中新增HTTP/2配置:
// 优先协商HTTP/2,不支持则降级为HTTP/1.1 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
2. 请求头与终端cURL存在差异的原因
所有差异都来自两边的默认配置与手动配置的区别:
- 终端curl的默认请求头仅包含
Host、User-Agent: curl/[版本号]、Accept: */*,以及手动指定的x-grau-instancia: 2,不会主动添加其他头字段。 - 你提供的PHP代码中手动设置了自定义的User-Agent,同时你实际运行的代码(与你贴出的片段不完全一致)额外添加了
accept、accept-encoding、accept-language、content-type这些自定义头,才会和终端curl的请求头不一致。
另外补充你请求卡住的可能原因:
你代码中传的x-grau-instancia值为1,和终端测试时传的2不一致,同时目标服务可能对HTTP/1.1的请求存在访问限制,导致请求无响应。
修正后的完整参考代码如下:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://pje.trt15.jus.br/pje-consulta-api/api/processos/dadosbasicos/00114894220185150137'); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'x-grau-instancia: 2', 'Accept: */*' ]); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT:!DH'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'curl/7.58.0'); // 启用HTTP/2协商 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS); curl_setopt($ch, CURLOPT_VERBOSE, true); $ping = curl_exec($ch); // 调试时可以输出错误信息 if(curl_errno($ch)) { echo 'cURL错误: ' . curl_error($ch); } curl_close($ch);
内容的提问来源于stack exchange,提问作者Bruno Batista
相关产品推荐
相关产品推荐

