2017-07-07 44 views
0

我的問題不是要找出服務器是否支持HTTP/2(他們都這樣做),但如何確保PHP正在使用HTTP/2與正確的cURL設置爲CentOS中最新的PHP版本(由Remi的存儲庫構建)。我自己的回答解決了這方面的一些古怪問題。PHP 7.1:沒有cURL與HTTP/2

我設置我的CentOS 7服務器支持HTTP/2與這一優良嚮導的幫助:Setting up HTTP/2 on your web server

所以我已經得到了最新版本,編譯和安裝他們和所有工作正常。頁面與HTTP/2標題一起提供,完全按照它們應該的方式。

現在我想在我的PHP腳本中使用HTTP/2功能。主要通過以HTTP/2方式進行cURL調用。我發現我需要升級libcurl並使用特定的HTTP/2支持進行構建和編譯。隨着一些挫折,我得到了它的工作。

所以curl -V告訴我:

curl 7.55.0-DEV (x86_64-unknown-linux-gnu) libcurl/7.55.0-DEV OpenSSL/1.1.0f zlib/1.2.7 nghttp2/1.23.1 
Release-Date: [unreleased] 
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy 

太好了!

而且phpinfo()讓我在新安裝的OpenSSL的結合相同的版本(7.55.0-DEV),它是:

OpenSSL 1.1.0f 25 May 2017

而且Apache的,BTW:

Server version: Apache/2.4.26 (Unix) 
Server built: Jul 7 2017 09:47:22 

然而,當我用cURL調用寫一個簡單的PHP腳本,CURLOPT_HTTP_VERSION選項設置爲CURL_HTTP_VERSION_2_0,如本例中所述:https://stackoverflow.com/a/37146586/1005334,它告訴我se rver沒有HTTP/2支持...

這怎麼可能?

一件事我注意到,即將在phpinfo() OpenSSL的模塊位仍然提到了我的老版本的OpenSSL(OpenSSL的1.0.1e-FIPS),雖然捲曲模塊中提到的OpenSSL的版本規定的OpenSSL 1.1.0f。

我已經從Remi的倉庫安裝了PHP 7.1(它目前的版本是7.1.7),它是否是針對較舊的OpenSSL版本構建的,因此它不適用於我的新版本?我也在PHP/7中讀取HTTP/2的支持不是很明顯,但我認爲它不應該是一個問題,對吧?

或者是OpenSSL不是問題,我應該看看其他地方,也許編譯PHP從源頭與一些預期的標誌?

+0

[用PHP創建HTTP/2請求](https://stackoverflow.com/q/37140780/1255289) – miken32

回答

2

一些擺弄後的好處,似乎我可以打通一個PHP捲曲的呼叫與HTTP/2響應Remi的PHP軟件包和新建的cURL/OpenSSL。

我用此片的代碼來測試(從here截取):所需

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."; 
} 

的調整,分別爲:

CURLOPT_HTTP_VERSION => 3 

...和:

if ($response !== false && strpos($response, "HTTP/2") === 0) 

因此,而不是CURL_HTTP_VERSION_2_0作爲cURL選項中的HTTP版本,我用3,這應該意味着相同,但顯然PHP在使用CURL_HTTP_VERSION_2_0時沒有選擇正確的值。看看這個給出的原始反應,我注意到Google發回的是HTTP/2而不是HTTP/2.0

我希望這可以幫助別人!

1

我的存儲庫中的軟件包是針對標準基礎存儲庫構建的,因此OpenSSL 1.0.1e和Curl 7.29.0(使用NSS)。

所以,你必須重建其使用論文庫一切採取的新功能(包括PHP)

+0

可能的重複我正在考慮它,但希望它不是必需的,因爲我有Apache,cURL和OpenSSL一起玩。但是,似乎可以完成(請參閱我對自己問題的回答)。 – kasimir