2017-07-07 2 views
0

Ma question n'est pas de savoir si un serveur supporte HTTP/2 (ils le font tous les deux) mais comment s'assurer que PHP utilise HTTP/2 avec les paramètres cURL corrects pour le la version la plus récente de PHP dans CentOS (construite à partir du dépôt de Remi). Ma propre réponse aborde certaines bizarreries à ce sujet.PHP 7.1: pas de cURL avec HTTP/2

J'ai installé mon CentOS 7 serveur pour soutenir HTTP/2 avec l'aide de ce guide bien: Setting up HTTP/2 on your web server

J'ai les dernières versions, et les installer compilé et tout fonctionne bien. Les pages sont servies avec les en-têtes HTTP/2, exactement comme ils le devraient.

Maintenant, je voudrais utiliser la fonctionnalité HTTP/2 dans mes scripts PHP. Principalement en faisant des appels cURL en mode HTTP/2. J'ai découvert que j'avais besoin de mettre à niveau libcurl et de le compiler avec un support HTTP/2 spécifique. Avec quelques revers, je l'ai eu pour travailler.

Alors curl -V me dit:

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 

Great!

Et phpinfo() me donne la même version (7.55.0-DEV) conjointement avec le OpenSSL nouvellement installé, qui est:

OpenSSL 1.1.0f 25 May 2017

Et Apache, BTW:

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

Cependant, quand je écrire un script PHP simple avec un appel cURL et l'option CURLOPT_HTTP_VERSION définie sur CURL_HTTP_VERSION_2_0, comme indiqué dans cet exemple: https://stackoverflow.com/a/37146586/1005334, il me dit la rver n'a pas de support HTTP/2 ...

Comment cela peut-il être?

Une chose que je remarqué, est le bit sur le module OpenSSL phpinfo() mentionne encore mon ancienne version OpenSSL (1.0.1e-OpenSSL FIPS), bien que la version OpenSSL mentionnée avec le module cURL indique 1.1.0f OpenSSL.

J'ai installé PHP 7.1 (il se trouve actuellement à la version 7.1.7) à partir du dépôt de Remi, pourrait-il être construit avec une version plus ancienne d'OpenSSL donc il ne fonctionnera pas avec mon plus récent? Je lis aussi le support en PHP 7 car HTTP/2 n'est pas très apparent, mais j'imagine que ça ne devrait pas poser de problème, non?

Ou est OpenSSL pas le problème et devrais-je chercher ailleurs, peut-être compiler PHP à partir de la source avec des drapeaux destinés?

+0

Possible copie de [Faire une requête HTTP/2 avec PHP] (https://stackoverflow.com/q/37140780/1255289) – miken32

Répondre

2

Après quelques tripoter, il semble que je peux obtenir une réponse HTTP/2 à un appel PHP cURL avec Les paquets PHP de Remi et un cURL/OpenSSL fraîchement construit.

j'utilisais ce morceau de code à tester (prise de 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."; 
} 

Les réglages nécessaires, étaient les suivantes:

CURLOPT_HTTP_VERSION => 3 

... et:

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

Donc, au lieu de CURL_HTTP_VERSION_2_0 en version HTTP dans les options cURL, j'ai utilisé 3, ce qui devrait signifier la même chose, mais apparemment PHP ne prend pas la bonne valeur lors de l'utilisation CURL_HTTP_VERSION_2_0.

En regardant la réponse brute cela a donné, j'ai remarqué que Google renvoyait HTTP/2 au lieu de HTTP/2.0. J'espère que cela peut aider quelqu'un!

1

Les packages de mon référentiel sont construits par rapport au référentiel de base standard, donc OpenSSL 1.0.1e et Curl 7.29.0 (en utilisant NSS).

Vous devez reconstruire tout ce qui utilise la bibliothèque de thèses pour bénéficier de nouvelles fonctionnalités (y compris PHP)

+0

Je l'envisageais, mais j'espérais que ce ne serait pas nécessaire, puisque j'avais Apache, cURL et OpenSSL joue déjà. Cependant, il semble que cela puisse être fait (voir ma réponse à ma propre question). – kasimir