繁体   English   中英

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

[英]How to detect if a site supports HTTP/2 in PHP

PHP 中是否有一种简单的方法来测试 URL 是否支持 HTTP/2? 我尝试根据规范中的 HTTP/2 标识在curl_setopt($curl, CURLOPT_HEADER, true)检查连接升级或 h2。 有许多站点可以添加 URL,它会告诉站点是否支持 HTTP/2。 只是想知道他们是如何测试它的,以及是否可以在 PHP 中完成类似的操作。 在命令行上,我可以执行类似$ curl -vso --http2 https://www.example.com/

2021-02-25 更新
正如djdance提到的, HTTP/2.0已经成为HTTP/2有一段时间了。 因此,您应该真正检查HTTP/2 (以及即将到来的 HTTP HTTP/3 3)。

如果你不想使用strpos ,你现在也可以在使用 PHP 8 时使用str_starts_with($response, "HTTP/2") 。否则你可以使用substr($response, 0, 6) === "HTTP/2"对于 PHP 7。

对于 PHP 7.3 和 cURL 7.50.0, curl_getinfo现在还支持CURLINFO_HTTP_VERSION

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

CURLINFO_HTTP_VERSION可能返回的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 都需要支持 HTTP/2.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 是否确实发出了 HTTP/2.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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM