如何在 PHP 中发送 HTTP/2 POST 请求

How do I send a HTTP/2 POST request in PHP

我在 发现了一个类似的问题 但我想用 PHP

更新我的服务器

新的 Apple 推送通知 HTTP/2 基于 API 描述如下:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html

任何有 HTTP/2 经验的人都可以帮助我作为 PHP 中的客户提出请求。

目前PHP没有直接的HTTP/2支持。

有一个 想法 可以在将来直接向 PHP 添加这样的支持: https://wiki.php.net/ideas/php6#http2_support

第 3 方库 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,
]);

PHP >= 5.5.24 的 CURL 扩展支持 HTTP/2。 (自 this commit

您还需要安装 libcurl——curl 函数使用的底层库——并启用 HTTP/2 支持。这意味着 libcurl 比 7.38.0 更新,但实际上,越新越好。 Libcurl 必须在构建时明确启用 HTTP/2 支持,在编译时使用 --with-nghttp2 标志。

只需像平常一样使用 curl,并通过传入 CURL_HTTP_VERSION_2_0CURLOPT_HTTP_VERSION 选项设置为使用 HTTP/2。然后你会把请求升级到版本 2 如果客户端和服务器都支持它。

在 PHP 5.5.24 之前,如果 libcurl 构建时支持 HTTP/2,您可以显式传入 CURL_HTTP_VERSION_2_0 的 int 值,因为 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 不足以使用 curl 发出 HTTP/2 请求,即使定义了 CURL_HTTP_VERSION_2_0。如果您尝试向 APNS(Apple 推送通知服务)发出请求,您将收到如下错误消息:

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

由于 curl 是 libcurl 的 binding,您还必须启用 http/2 的 curl。

有关示例代码,请参阅我的 answer 此处关于 SO

的类似问题

安装步骤可以按照这个tutorial

查看我为此目的构建的 Apache and CLI PHP Docker 图片,添加 HTTP/2 支持官方 PHP 5.6 docker 图书馆。这消除了任何 HTTP/2 client preface string missing or corrupt 错误。

一旦你拥有合适的环境,为 PHP 尝试了几个 JWS/JWT 库,我只发现 Spomky-Labs/jose 与 APNs 完美配合。