Как отправить HTTP/2 POST-запрос в PHP

Я нашел аналогичный вопрос в Отправка HTTP/2 запроса POST в Ruby Но я хочу обновить свой сервер с помощью PHP

Новый API-интерфейс HTTP/2, основанный на Apple push push, описанный здесь: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html

Любой, у кого есть опыт HTTP/2, помогает мне сделать запрос в качестве клиента на PHP.

Ответы

Ответ 1

Расширение CURL для PHP >= 5.5.24 поддерживает HTTP/2. (поскольку этот коммит)

Вам также понадобится установить libcurl - базовую библиотеку, которая использует функции curl - при включенной поддержке HTTP/2. Это означает, что libcurl новее, чем 7.38.0, но на самом деле, чем выше, тем лучше. Libcurl должен быть построен с поддержкой HTTP/2, явно включенным, используя флаг --with-nghttp2 во время компиляции.

Просто используйте curl, как вы обычно его используете, и установите параметр CURLOPT_HTTP_VERSION для использования HTTP/2, передав CURL_HTTP_VERSION_2_0. Затем вы получите обновление до версии 2, если клиент и сервер поддерживают его.

До PHP 5.5.24, если libcurl был создан с поддержкой HTTP/2, вы можете явно передать значение int CURL_HTTP_VERSION_2_0, поскольку PHP все равно передаст его libcurl. В настоящее время он имеет значение 3 - это не должно меняться, но может.

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);

Ответ 2

Наличие PHP >= 5.5.24 недостаточно, чтобы сделать запрос HTTP/2 с curl, даже если CURL_HTTP_VERSION_2_0 определен. При попытке сделать запрос в APNS (Apple Push Notification Service) вы получите сообщение об ошибке следующего вида:

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

Поскольку curl является binding для libcurl, вы также должны иметь завиток с включенным http/2.

Для примера кода см. мой ответ на аналогичный вопрос здесь на SO

Для процедуры установки вы можете следовать этому учебнику

Ответ 3

В настоящий момент в PHP нет прямой поддержки HTTP/2.

Существует идея , чтобы добавить такую ​​поддержку в будущем прямо к PHP: https://wiki.php.net/ideas/php6#http2_support

Сторонняя библиотека Guzzle https://github.com/guzzle/guzzle поддерживает HTTP/2, если установлены правильная версия php и curl:

use GuzzleHttp\Client;

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

Ответ 4

Посмотрите Apache и CLI Изображения PHP Docker, которые я создал для этой цели, которые добавляют поддержку HTTP/2 официальной библиотеке докеров PHP 5.6. Это избавляет от любых ошибок HTTP/2 client preface string missing or corrupt.

Как только у вас есть правильная среда, попробовав несколько библиотек JWS/JWT для PHP, я нашел Spomky-Labs/jose, чтобы отлично работать с APN.