首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中检测站点是否支持HTTP/2

如何在PHP中检测站点是否支持HTTP/2
EN

Stack Overflow用户
提问于 2017-11-18 02:56:08
回答 1查看 2.5K关注 0票数 12

在PHP中有没有一种简单的方法来测试URL是否支持HTTP/2?我尝试在中检查连接升级或h2curl_setopt($curl, CURLOPT_HEADER, true)根据

HTTP[ specs](http://httpwg.org/specs/rfc7540.html#versioning)中的

/2标识..。有许多网站,你可以添加一个URL,它会告诉你网站是否支持HTTP/2。我只是想知道他们是如何测试它的,以及是否可以用PHP做类似的事情。在命令行上,我可以这样做

$ curl -vso --http2 https://www.example.com/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 19:13:14

更新2021-02-25:

作为mentioneddjdanceHTTP/2.0一直是HTTP/2已经有一段时间了。因此,你真的应该检查一下HTTP/2(及HTTP/3对于即将到来的HTTP 3)。

如果您不想使用strpos,您现在还可以使用

str_starts_with($response, "HTTP/2")在使用PHP 8时。否则,您可以使用

substr($response, 0, 6) === "HTTP/2"适用于PHP 7。

对于PHP7.3和cURL 7.50.0,curl_getinfo现在还支持

CURLINFO_HTTP_VERSION

echo curl_getinfo($ch, CURLINFO_HTTP_VERSION);
// 3 for HTTP/2

可能返回的值CURLINFO_HTTP_VERSION(从PHP 7.3开始):

CURL_HTTP_VERSION_NONE              === 0
CURL_HTTP_VERSION_1_0               === 1
CURL_HTTP_VERSION_1_1               === 2
CURL_HTTP_VERSION_2                 === 3
CURL_HTTP_VERSION_2_0               === 3
CURL_HTTP_VERSION_2TLS              === 4
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE === 5

这意味着您可以检查特定的(例如,CURL_HTTP_VERSION_2TLS,它是TLS上的HTTP/2 ):

if (
    $response !== false
    && curl_getinfo($ch, CURLINFO_HTTP_VERSION) === CURL_HTTP_VERSION_2TLS
) {
    // The connection was established using HTTP/2 over TLS
    // if the server does not support TLS HTTP/1.1 will be used.
}

原件:

您的服务器和安装的cURL都需要支持HTTP2.0。在此之后,您只需发出一个普通的cURL请求并添加CURLOPT_HTTP_VERSION参数,该参数将使cURL尝试发出HTTP/2.0请求。在此之后,您必须检查请求的头部,以检查服务器是否确实支持HTTP/2.0。

示例:

$url = "https://google.com";
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => $url,
    CURLOPT_HEADER         => true,
    CURLOPT_NOBODY         => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_2_0, // cURL will attempt to make an HTTP/2.0 request (can downgrade to HTTP/1.1)
]);
$response = curl_exec($ch);

现在,您需要检查cURL是否确实发出了HTTP2.0请求:

if ($response !== false && strpos($response, "HTTP/2.0") === 0) {
    echo "Server of the URL has HTTP/2.0 support."; // yay!
} elseif ($response !== false) {
    echo "Server of the URL has no HTTP/2.0 support."; // nope!
} else {
    echo curl_error($ch); // something else happened causing the request to fail
}
curl_close($ch);
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47357483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档