2016-01-05 2 views
16

Я нашел аналогичный вопрос на Sending HTTP/2 POST request in Ruby Но я хочу, чтобы обновить свой сервер с PHPКак отправить запрос HTTP/2 POST в PHP

Нового Apple Push уведомление HTTP/2 на основе API, описанная здесь: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html

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

ответ

12

Расширение CURL для PHP> = 5.5.24 поддерживает HTTP/2. (с this commit)

Вам также потребуется установить 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); 
+0

Я попытался установить обе версии 5.6.21 и 7.0.6 XAMPP как на Mac, так и на Linux, но я всегда получаю эту ошибку: 'HTTP/2 client строка префикса отсутствует или повреждена. Hex дамп для принятых байтов ... '. Вы знаете, как я могу это решить? Я могу отправить push-уведомления из командной строки, но в PHP это не работает. – Nickkk

+0

Я хотел бы понять, будут ли push-уведомления с HTTP/2 и curl 7.38.0 работать в среде совместного размещения? Раньше хостинг-провайдеры блокировали порты 2195 и 2196 из-за соображений безопасности, поэтому push-уведомление с использованием TCP-сокета было бы невозможным. –

+0

@raj: это совершенно отдельный вопрос, не подходящий для комментария к ответу ... –

1

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

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

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

use GuzzleHttp\Client; 

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

Разве это не работа? https://github.com/guzzle/guzzle/issues/1249 – fntlnz

6

Имея PHP> = 5.5.24 не достаточно, чтобы сделать HTTP/2 запрос с завитком, даже если 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 

С загнутым является binding для Libcurl, вы также должны иметь завиток с HTTP/2 включен ,

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

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

+1

спасибо! Это сработало. Хотя я проверил заголовки запросов, используя 'CURLINFO_HEADER_OUT', и он показывает« HTTP/1.1 ». Но он работает сейчас, где он не работал раньше. – andho

+0

У меня PHP 5.6, curl 7.54 (с поддержкой HTTP2) и OpenSSL 1.0.1, но 'CURL_HTTP_VERSION_2_0' до сих пор не определено, любые идеи почему? При попытке подключения Apple возвращает сообщение об ошибке «Непредвиденный HTTP/1.x запрос». – andreszs

+1

@Andrew проверить, что ваш curl OpenSSL версии выше 1.0.1. Я закончил без необходимости перекомпилировать мою версию PHP, чтобы наконец обнаружить, что APN Apple требуют никогда не версии TLS. – Larcho

0

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

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

Смежные вопросы