gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:11:15 25 4
gpt4 key购买 nike

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

的操作

最佳答案

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

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

对于 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 可能返回的值(从 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 请求。之后,您必须检查请求中的 header ,以检查服务器是否确实支持 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);

关于php - 如何在 PHP 中检测站点是否支持 HTTP/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47357483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com