【问题标题】:PHP CURL doesn't finish requestPHP CURL 没有完成请求
【发布时间】:2022-01-01 07:09:29
【问题描述】:

我在 PHP7.2 上使用 curl 库在网站上发送请求。 这是链接:

https://pje.trt15.jus.br/pje-consulta-api/api/processos/dadosbasicos/00114894220185150137

如果在终端上使用 cURL 发送请求,我会得到这些标头和响应:

curl https://pje.trt15.jus.br/pje-consulta-api/api/processos/dadosbasicos/00114894220185150137 -H "x-grau-instancia: 2" -v

*   Trying 23.46.150.41...
* TCP_NODELAY set
* Connected to pje.trt15.jus.br (23.46.150.41) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Client hello (1):
* TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=www.trt15.jus.br
*  start date: Sep 28 17:24:47 2021 GMT
*  expire date: Dec 27 17:24:46 2021 GMT
*  subjectAltName: host "pje.trt15.jus.br" matched cert's "pje.trt15.jus.br"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* Using Stream ID: 1 (easy handle 0x55c5a2365600)
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):

\> GET /pje-consulta-api/api/processos/dadosbasicos/00114894220185150137 HTTP/2
> Host: pje.trt15.jus.br
> User-Agent: curl/7.58.0
> Accept: */*
> x-grau-instancia: 2
>
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
< HTTP/2 200
< x-request-id: c85077d1-ce68-4ce5-8e88-744203769ea7
< content-type: application/json
< content-length: 150
< x-frame-options: SAMEORIGIN
< strict-transport-security: max-age=15768000; includeSubDomains; preload
< x-content-type-options: nosniff
< referrer-policy: no-referrer-when-downgrade
< feature-policy: camera 'none'; microphone 'none'
< expires: Mon, 22 Nov 2021 17:10:48 GMT
< cache-control: max-age=0, no-cache, no-store
< pragma: no-cache
< date: Mon, 22 Nov 2021 17:10:48 GMT
< server-timing: cdn-cache; desc=MISS
< server-timing: edge; dur=115
< server-timing: origin; dur=10
<
* Connection #0 to host pje.trt15.jus.br left intact

但是,如果我使用php库,头部是其他的,并且请求没有完成

*   Trying 23.46.150.41...
* TCP_NODELAY set
* Connected to pje.trt15.jus.br (23.46.150.41) port 443 (#0)
* ALPN, offering http/1.1
* Cipher selection: DEFAULT:!DH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=www.trt15.jus.br
*  start date: Sep 28 17:24:47 2021 GMT
*  expire date: Dec 27 17:24:46 2021 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.

\> GET /pje-consulta-api/api/processos/dadosbasicos/00114894220185150137 HTTP/1.1
Host: pje.trt15.jus.br
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
content-type: application/json
x-grau-instancia: 2

更新 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: 1']);
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, ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36');
curl_setopt($ch, CURLOPT_VERBOSE, true);
$ping = curl_exec($ch);

为什么 curl 库不继续 HTTP2 请求?为什么 hedaers 不一样?

【问题讨论】:

  • 可能是一个太旧的 curl 库。尝试升级 PHP。
  • 这对我来说不是一个选项,我在 prod env 中使用 pthreads 并且仅适用于 php 7.2 :´(.
  • curl 库与安装在 SO 中的 curl 库不一样?
  • PHP 库是什么意思?为什么不在 PHP 上使用 curl?或使用: curl to php incarnate.github.io/curl-to-php 粘贴您的 curl 并将代码复制到您的代码 echo 结果...您尝试过吗?
  • 我应该写扩展而不是库。我在使用 7.1 时有一个带有 curl 的标题错误,后来通过升级到 7.3 解决了这个问题。这只是一个建议。改用 Guzzle 可能会有所帮助?

标签: php ssl curl https php-curl


【解决方案1】:

由于服务器使用 TSL1.3,您可以尝试使用 curl_setoptCURLOPT_TLS13_CIPHERS 指定一个值

来自manual

用于 TLS 1.3 连接的密码套件列表。该列表必须在语法上正确,它由一个或多个用冒号分隔的密码套件字符串组成。此选项当前仅在 curl 构建为使用 OpenSSL 1.1.1 或更高版本时使用。如果您使用不同的 SSL 后端,您可以尝试使用 CURLOPT_SSL_CIPHER_LIST 选项设置 TLS 1.3 密码套件。

注意有三个要求:

自 PHP 7.3.0 起可用

libcurl >= cURL 7.61.0.

在使用 OpenSSL >= 1.1.1 构建时可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2011-03-07
    相关资源
    最近更新 更多