2016-01-05 25 views

risposta

12

L'estensione CURL per PHP> = 5.5.24 supporta HTTP/2. (dal this commit)

È inoltre necessario installare un libcurl, ovvero la libreria sottostante utilizzata dalle funzioni di curl, con supporto HTTP/2 abilitato. Ciò significa un libcurl più recente di 7.38.0 ma in realtà, più recente è, meglio è. Libcurl deve essere stato costruito con supporto HTTP/2 abilitato esplicitamente, usando il flag --with-nghttp2 in fase di compilazione.

Utilizzare l'arricciatura come si usa normalmente e impostare l'opzione CURLOPT_HTTP_VERSION per utilizzare HTTP/2 passando CURL_HTTP_VERSION_2_0. Quindi la richiesta verrà aggiornata alla versione 2 se il client e il server lo supportano entrambi.

Prima di PHP 5.5.24, se libcurl è stato creato con supporto HTTP/2, è possibile passare il valore int di CURL_HTTP_VERSION_2_0 in modo esplicito in quanto PHP lo passerà ancora attraverso libcurl. Attualmente, ha un valore di 3 - questo non dovrebbe cambiare, ma potrebbe.

if (!defined('CURL_HTTP_VERSION_2_0')) { 
    define('CURL_HTTP_VERSION_2_0', 3); 
} 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); 
+0

Ho provato ad installare entrambe le versioni 5.6.21 e 7.0.6 di XAMPP su Mac e Linux, ma ottengo sempre questo errore: 'Client HTTP/2 stringa di prefazione mancante o corrotta. Hex dump per byte ricevuti ... '. Sai come posso risolvere questo? Sono in grado di inviare notifiche push dalla riga di comando, ma in PHP non funziona. – Nickkk

+0

Vorrei capire se le notifiche push con HTTP/2 e curl 7.38.0 funzioneranno nell'ambiente di hosting condiviso? I provider di hosting precedentemente condivisi bloccheranno le porte 2195 e 2196 a causa di motivi di sicurezza, quindi la notifica push tramite socket TCP non sarebbe possibile. –

+0

@raj: questa è una domanda completamente separata, non adatta per un commento ad una risposta ... –

1

Al momento non è disponibile il supporto diretto HTTP/2 in PHP.

C'è un idea per aggiungere un tale sostegno in futuro direttamente a PHP: https://wiki.php.net/ideas/php6#http2_support

La biblioteca 3rd Party gozzovigliare https://github.com/guzzle/guzzle supporta i protocolli HTTP/2, se il php corretta e la versione ricciolo sono installati:

use GuzzleHttp\Client; 

$client = new Client(); 
$client->get('https://http2.akamai.com/demo/tile-0.png', [ 
    'version' => 2.0, 
    'debug' => true, 
]); 
+3

Non è un lavoro in corso? https://github.com/guzzle/guzzle/issues/1249 – fntlnz

6

Avere PHP> = 5.5.24 non è sufficiente per fare una richiesta HTTP/2 con l'arricciatura, anche se CURL_HTTP_VERSION_2_0 è definito. Si otterrà un messaggio di errore simile al seguente se si tenta di fare una richiesta al APNS (Apple Push Notification Service):

[email protected]@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f616538666562613534 

Dal riccio è un binding per libcurl, è necessario anche avere ricciolo con http/2 abilitato .

Per un esempio di codice, vedere il mio answer a una domanda simile qui su SO

Per procedura di installazione, è possibile seguire questa tutorial

+1

grazie! Questo ha funzionato. Anche se ho controllato le intestazioni delle richieste usando 'CURLINFO_HEADER_OUT' e mostra' HTTP/1.1'. Ma sta funzionando ora, dove prima non funzionava. – andho

+0

Ho PHP 5.6, curl 7.54 (con supporto HTTP2) e OpenSSL 1.0.1 ancora 'CURL_HTTP_VERSION_2_0' è ancora indefinito, qualche idea perché? Apple restituisce un messaggio di errore "Richiesta HTTP/1.x imprevista" durante il tentativo di connessione. – andreszs

+1

@Andrew verifica che la tua versione di arricciatura OpenSSL sia superiore a 1.0.1. Ho finito per ricompilare inutilmente la mia versione di PHP per scoprire finalmente che gli APN di Apple richiedono una versione mai aggiornata di TLS. – Larcho

0

Scopri i Apache e CLI immagini PHP Docker ho costruito per questo scopo che aggiunge il supporto HTTP/2 alla libreria ufficiale di PHP 5.6. Questo elimina tutti gli errori HTTP/2 client preface string missing or corrupt.

Una volta ottenuto l'ambiente giusto, dopo aver provato diverse librerie JWS/JWT per PHP, ho trovato solo Spomky-Labs/jose per funzionare perfettamente con gli APN.

Problemi correlati