2016-05-10 93 views
4

有沒有辦法強制PHP創建到另一臺服務器的HTTP2連接,以查看該服務器是否支持它?使用PHP發出HTTP/2請求

我已經試過:

$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

你有沒有嘗試過:[This Answer](http://stackoverflow.com/questions/) 34606801/how-do-i-send-a-http-2-post-request-in-php) – Hexchaimen

+0

是爲支持HTTP/2而構建的libcurl版本嗎? –

回答

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請求,如捲曲--http2 -I https:// nghttp2.org /'在HTTP2模式下工作,但在切換到PHP時,它們會以HTTP 1.1的形式發送?我測試了你的代碼,但它仍然不能用於HTTP2模式。我有PHP 5.6和curl 7.54。 – andreszs

+0

@Andrew因爲你在命令行中使用的curl不一定是相同的,因爲它支持curl支持PHP。 – miken32