Curl PHP7.1:使用HTTP/2时没有卷曲

Curl PHP7.1:使用HTTP/2时没有卷曲,curl,libcurl,centos7,php-openssl,php-7.1,Curl,Libcurl,Centos7,Php Openssl,Php 7.1,我的问题不是找出一台服务器是否支持HTTP/2,它们都支持HTTP/2,而是如何确保PHP在CentOS中使用HTTP/2,并对从Remi存储库构建的最新PHP版本使用正确的cURL设置。我自己的回答解决了与此相关的一些奇怪问题 在本指南的帮助下,我已将CentOS 7服务器设置为支持HTTP/2: 所以我得到了最新的版本,编译并安装了它们,一切都很好。页面使用HTTP/2头提供服务,这与它们应该使用的完全一样 现在我想在我的PHP脚本中使用HTTP/2功能。主要通过HTTP/2方式执行cURL

我的问题不是找出一台服务器是否支持HTTP/2,它们都支持HTTP/2,而是如何确保PHP在CentOS中使用HTTP/2,并对从Remi存储库构建的最新PHP版本使用正确的cURL设置。我自己的回答解决了与此相关的一些奇怪问题

在本指南的帮助下,我已将CentOS 7服务器设置为支持HTTP/2:

所以我得到了最新的版本,编译并安装了它们,一切都很好。页面使用HTTP/2头提供服务,这与它们应该使用的完全一样

现在我想在我的PHP脚本中使用HTTP/2功能。主要通过HTTP/2方式执行cURL调用。我发现我需要升级libcurl,并使用特定的HTTP/2支持构建和编译它。经过一些挫折,我成功了

所以curl-V告诉我:

curl 7.55.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.55.0-DEV OpenSSL/1.1.0f zlib/1.2.7 nghttp2/1.23.1
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy 
太好了

phpinfo为我提供了与新安装的OpenSSL相同的7.55.0-DEV版本,即:

OpenSSL 1.1.0f 2017年5月25日

和Apache,顺便说一句:

Server version: Apache/2.4.26 (Unix)
Server built:   Jul  7 2017 09:47:22
但是,当我编写一个带有cURL调用的简单PHP脚本,并将CURLOPT_HTTP_VERSION选项设置为cURL_HTTP_VERSION_2_0(如本例所述)时,它告诉我服务器不支持HTTP/2

这怎么可能

我注意到的一点是,phpinfo中关于OpenSSL模块的部分仍然提到了我的老OpenSSL版本OpenSSL 1.0.1e-fips,尽管cURL模块中提到的OpenSSL版本声明了OpenSSL 1.1.0f

我已经安装了PHP7.1,它目前的版本是7.1.7,来自Remi的存储库,可能是它是针对较旧的OpenSSL版本构建的,所以不能与较新的版本一起使用吗?我还读到PHP7对HTTP/2的支持不是很明显,但我想这应该不会是个问题,对吧


或者OpenSSL不是问题所在,我是否应该看看其他地方,也许是从源代码处编译带有某些预期标志的PHP?

我的存储库中的包是根据标准基本存储库构建的,因此OpenSSL 1.0.1e和Curl 7.29.0使用NSS


因此,您必须重新构建使用这些库的所有内容,以利用新功能,包括PHP

“我的存储库”中的包是根据标准基本存储库构建的,因此OpenSSL 1.0.1e和Curl 7.29.0使用NSS


因此,您必须重新构建使用这些库的所有内容,以利用包括PHP在内的新功能。经过一些修改,我似乎可以通过使用Remi的PHP包和新构建的cURL/OpenSSL调用PHP cURL获得HTTP/2响应

我使用这段代码测试了以下内容:

所需的调整包括:

CURLOPT_HTTP_VERSION => 3
……和:

if ($response !== false && strpos($response, "HTTP/2") === 0)
因此,在CURL选项中,我没有使用CURL\u HTTP\u VERSION\u 2\u 0作为HTTP版本,而是使用了3,这应该是相同的意思,但显然PHP在使用CURL\u HTTP\u VERSION\u 2\u 0时没有选择正确的值

看看这封信给出的原始回复,我注意到谷歌发回的是HTTP/2,而不是HTTP/2.0


我希望这能帮助别人

经过一些修改,我似乎可以通过使用Remi的PHP包和新构建的cURL/OpenSSL调用PHP cURL获得HTTP/2响应

我使用这段代码测试了以下内容:

所需的调整包括:

CURLOPT_HTTP_VERSION => 3
……和:

if ($response !== false && strpos($response, "HTTP/2") === 0)
因此,在CURL选项中,我没有使用CURL\u HTTP\u VERSION\u 2\u 0作为HTTP版本,而是使用了3,这应该是相同的意思,但显然PHP在使用CURL\u HTTP\u VERSION\u 2\u 0时没有选择正确的值

看看这封信给出的原始回复,我注意到谷歌发回的是HTTP/2,而不是HTTP/2.0


我希望这能帮助别人

我正在考虑,但希望没有必要,因为我已经有了Apache、cURL和OpenSSL。不过,看起来这是可以做到的,看看我对自己问题的回答。我正在考虑,但希望没有必要,因为我已经有了Apache、cURL和OpenSSL。然而,似乎这是可以做到的,看看我对自己问题的回答