2016-05-10 7 views
4

Есть ли способ заставить PHP сделать HTTP2-соединение с другим сервером, чтобы проверить, поддерживает ли этот сервер?Сделать запрос HTTP/2 с PHP

Я пробовал:

$options = stream_context_create(array(
       'http' => array(
        'method' => 'GET', 
        'timeout' => 5, 
        'protocol_version' => 1.1 
       ) 
      )); 
$res = file_get_contents($url, false, $options); 
var_dump($http_response_header); 

И попробовал:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, 3); 
$response = curl_exec($ch); 
var_dump($response); 
curl_close($ch); 

Но оба способа дают мне ответ HTTP1.1, если я использую следующий URL https://www.google.com/#q=apache+2.5+http%2F2

Я отправив запрос из домена с поддержкой протокола HTTP/2 + SSL. Что я делаю не так?

+0

, какую версию PHP вы используете? посмотрите здесь https://blog.cloudflare.com/tools-for-debugging-testing-and-using-http-2/ –

+0

вы пробовали: [Этот ответ] (http://stackoverflow.com/questions/ 34606801/how-do-i-send-a-http-2-post-request-in-php) – Hexchaimen

+0

- это версия libcurl, построенная для поддержки HTTP/2? –

ответ

4

Насколько я знаю, cURL - единственный способ передачи в PHP, который поддерживает HTTP 2.0.

Вам в первую очередь необходимо проверить, что ваша версия скручивания может поддержать его, а затем установить правильную версию заголовок:

if (curl_version()["features"] & CURL_VERSION_HTTP2 !== 0) { 
    $url = "https://www.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, 
    ]); 
    $response = curl_exec($ch); 
    if ($response !== false && strpos($response, "HTTP/2.0") === 0) { 
     echo "HTTP/2 support!"; 
    } elseif ($response !== false) { 
     echo "No HTTP/2 support on server."; 
    } else { 
     echo curl_error($ch); 
    } 
    curl_close($ch); 
} else { 
    echo "No HTTP/2 support on client."; 
} 
+0

В зависимости от вашей платформы/версий вам может потребоваться несколько настроек, чтобы сделать это, как это было со мной: [https://stackoverflow.com/a/45110402/1005334] – kasimir

+0

Любые идеи, почему запросы CLI, такие как 'curl --http2 -I https: // nghttp2.org/'работают в режиме HTTP2, но при переключении на PHP они отправляются как HTTP 1.1 вместо этого? Я проверил ваш код, и он по-прежнему не работает в режиме HTTP2. У меня PHP 5.6 и curl 7.54. – andreszs

+0

@Andrew Поскольку завиток, который вы используете в командной строке, не обязательно совпадает с тем, что выполняется в PHP для поддержки curl. – miken32

 Смежные вопросы

  • Нет связанных вопросов^_^