当我尝试向苹果推送服务发送 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 failed: Received HTTP/0.9 when not allowed | 0
我在上面截取的代码的第二行明确告诉 curl 使用 HTTP/2.0。有谁知道该错误消息的含义以及为什么 curl 使用如此旧的 HTTP 版本?
我使用的是 PHP 7.2 和 curl 版本 7.66.0。
原文由 rockZ 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想到了。确保 curl 是使用 nghttp2 编译的。
如果不确定,可以在终端上使用
curl --version
检查它如果你没有找到 nghttp2/{version} 你需要用 nghttp2 再次编译 curl。
curl --version
缺少 nghttp2 的示例:curl --version
nghttp2 可用的示例: