PHP Curl - 在不允许时收到 HTTP/0.9

问题描述 投票:0回答:4

当我尝试向苹果推送服务发送 HTTP/2.0 请求时,我偶然发现了一个奇怪的行为:

        $http2ch = curl_init();
        curl_setopt($http2ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
        curl_setopt($http2ch, CURLOPT_URL, 'https://api.push.apple.com/3/device/megauniquedevicetokendummy');
        curl_setopt($http2ch, CURLOPT_PORT, 443);
        curl_setopt($http2ch, CURLOPT_HTTPHEADER, $httpHeader);
        curl_setopt($http2ch, CURLOPT_POST, true);
        curl_setopt($http2ch, CURLOPT_POSTFIELDS, $body);
        curl_setopt($http2ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($http2ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($http2ch, CURLOPT_HEADER, 1);

       $result = curl_exec($http2ch);
       if ($result === false) {
           throw new \Exception("Curl failed: " . curl_error($http2ch) . " | " . curl_getinfo($http2ch, CURLINFO_HTTP_CODE));
       }

异常随消息一起抛出: Curl 失败:在不允许时收到 HTTP/0.9 | 0

我在上面代码的第二行明确告诉curl使用HTTP/2.0。 有谁知道该错误消息的含义以及为什么curl 使用如此旧的HTTP 版本?

我使用的是 PHP 7.2 和curl 版本 7.66.0。

php http curl apple-push-notifications
4个回答
29
投票

当服务器是 grpc 服务器时,也会发生这种情况。当curl针对grpc服务器或其他非HTTP服务器运行时,这些服务器不响应curl期望的有效HTTP状态行,curl将打印“不允许时接收到的HTTP/0.9”。

如果curl打印诸如“未知协议”之类的东西而不是假设它是0.9,可能会更好,因为现在访问像grpc服务器这样的东西将比实际的HTTP 0.9服务器更常见。


8
投票

我想通了。 确保curl是用nghttp2编译的。

如果您不确定,您可以使用

curl --version

在终端上进行检查

如果没有找到nghttp2/{version},则需要使用nghttp2再次编译curl。

curl --version
缺少 nghttp2 的示例:

curl 7.66.0 (amd64-portbld-freebsd12.0) libcurl/7.66.0 OpenSSL/1.1.1d zlib/1.2.11

curl --version
nghttp2 可用的示例:

curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2

4
投票

我不认为它需要您以不同的方式编译一个版本的curl,而是设置选项以允许http 0.9作为来自旧服务器的响应。 PHP 对“CURLOPT_HTTP09_ALLOWED”有一些注释,当您通过 https://www.php.net/manual/en/function.curl-setopt.php

发布问题时,这些注释可能有所不同

为我克服错误的选项是:

curl_setopt($http2ch, CURLOPT_HTTP09_ALLOWED, true);

0
投票

只是分享我的经验。 我对我的 php 和 elasticsearch 进行了 Docker 化。并映射端口9300:9200 并出现上述错误 我将端口映射更改为 9200:9200 并解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.