Я нашел аналогичный вопрос при отправке запроса HTTP / 2 POST в Ruby. Но я хочу обновить свой сервер с помощью PHP
Новый API-интерфейс, основанный на HTTP-объявлении Apple push-уведомления, описанный здесь: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html
Любой, у кого есть опыт HTTP / 2, помогает мне сделать запрос в качестве клиента на PHP.
Расширение 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);
Если PHP> = 5.5.24 недостаточно, чтобы сделать запрос HTTP / 2 с curl, даже если CURL_HTTP_VERSION_2_0 определен. При попытке сделать запрос в APNS (Apple Push Notification Service) вы получите сообщение об ошибке следующего вида:
?@@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f616538666562613534
Поскольку curl является обязательным для libcurl, вы также должны иметь завиток с включенным http / 2.
Для примера кода см. Мой ответ на аналогичный вопрос здесь, на SO
Для процедуры установки вы можете следовать этому руководству
В настоящий момент в 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('http://img.ruphp.com/php/tile-0.png', [ 'version' => 2.0, 'debug' => true, ]);
Ознакомьтесь с изображениями Apache и CLI PHP Docker, которые я создал для этой цели, которые добавляют поддержку HTTP / 2 официальной библиотеке докеров PHP 5.6. Это избавляет от любой HTTP/2 client preface string missing or corrupt
ошибок.
Когда у вас есть правильная среда, попробовав несколько JWS / JWT-библиотек для PHP, я нашел Spomky-Labs / jose, чтобы отлично работать с APN.