web-dev-qa-db-fra.com

Comment envoyer un HTTP/2 POST demande en PHP

J'ai trouvé une question similaire à Envoi de la requête HTTP/2 POST en Ruby Mais je souhaite mettre à jour mon serveur avec PHP

La nouvelle API basée sur les notifications Apple Push HTTP/2 décrite ici: https://developer.Apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html

Toute personne ayant l'expérience HTTP/2 m'aide à faire une demande en tant que client en PHP.

17
mthuong

L’extension CURL pour PHP> = 5.5.24 prend en charge HTTP/2. (depuis ce commit )

Vous devez également installer libcurl, la bibliothèque sous-jacente utilisée par les fonctions curl, avec la prise en charge de HTTP/2 activée. Cela signifie une libcurl plus récente que la 7.38.0 mais, en réalité, la plus récente sera la meilleure. Libcurl doit avoir été construit avec le support HTTP/2 explicitement activé, en utilisant le drapeau --with-nghttp2 au moment de la compilation.

Utilisez simplement curl comme vous le feriez normalement, et définissez l'option CURLOPT_HTTP_VERSION pour qu'elle utilise HTTP/2 en transmettant CURL_HTTP_VERSION_2_0. Ensuite, la demande sera mise à niveau vers la version 2 si le client et le serveur la prennent en charge.

Avant PHP 5.5.24, si libcurl a été construit avec le support HTTP/2, vous pouvez transmettre la valeur int de CURL_HTTP_VERSION_2_0 explicitement, car PHP le transmettra toujours à libcurl. Actuellement, sa valeur est 3 - cela ne devrait pas changer, mais pourrait.

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);
16
Daniel Stenberg

Avoir PHP> = 5.5.24 ne suffit pas pour faire une requête HTTP/2 avec curl, même si CURL_HTTP_VERSION_2_0 est défini. Si vous essayez d'envoyer une demande à APNS (Apple Push Notification Service), vous recevrez un message d'erreur du type suivant:

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

Comme curl est un binding pour libcurl, vous devez également avoir curl avec http/2 activé. 

Pour un exemple de code, voir ma réponse à une question similaire ici sur SO

Pour la procédure d’installation, vous pouvez suivre ce tutorial

6
tiempor3al

À l'heure actuelle, il n'y a pas de support direct HTTP/2 en PHP.

Il y a un idea pour ajouter un tel support à l'avenir directement à PHP: https://wiki.php.net/ideas/php6#http2_support }

La bibliothèque tierce Guzzle https://github.com/guzzle/guzzle prend en charge HTTP/2, si les versions php et curl correctes sont installées:

use GuzzleHttp\Client;

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

Découvrez les images Docker Apache et CLI PHP que j’ai construites à cet effet et qui ajoutent la prise en charge HTTP/2 à la bibliothèque officielle PHP 5.6. Cela supprime toutes les erreurs HTTP/2 client preface string missing or corrupt.

Une fois que vous avez obtenu le bon environnement, après avoir essayé plusieurs bibliothèques JWS/JWT pour PHP, je n’ai trouvé que Spomky-Labs/jose fonctionnant parfaitement avec les APN.

0
Norbert