Как определить, поддерживает ли сайт HTTP/2 в PHP

Есть ли простой способ в PHP проверить, поддерживает ли URL-адрес HTTP/2? Я попытался проверить обновление соединения или h2 в curl_setopt($curl, CURLOPT_HEADER, true) согласно идентификация HTTP/2 в спецификациях. Есть много сайтов, на которых вы можете добавить URL-адрес, и он скажет, поддерживает ли сайт HTTP/2 или нет. Просто интересно, как они тестируют его, и если что-то подобное можно сделать в PHP. В командной строке я могу сделать что-то вроде $ curl -vso --http2 https://www.example.com/

Ответ 1

Оба сервера и ваша установка 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);