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

时间:2016-01-05 08:04:10

标签: php curl push-notification apple-push-notifications http2

我在Sending HTTP/2 POST request in Ruby找到了类似的问题 但我想用PHP更新我的服务器

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

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

4 个答案:

答案 0 :(得分:17)

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

您还需要安装libcurl - curl函数使用的基础库 - 启用HTTP / 2支持。这意味着比7.38.0更新的libcurl,但实际上,越新越好。 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);

答案 1 :(得分:6)

使用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,在此处了解类似问题

对于安装程序,您可以按照此tutorial

进行操作

答案 2 :(得分:2)

目前在PHP中没有直接的use GuzzleHttp\Client; $client = new Client(); $client->get('https://http2.akamai.com/demo/tile-0.png', [ 'version' => 2.0, 'debug' => true, ]); 支持。

想法将来直接添加到PHP的支持: https://wiki.php.net/ideas/php6#http2_support

第三方库Guzzle https://github.com/guzzle/guzzle支持HTTP / 2,如果安装了正确的php和curl版本:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    mMap.setMyLocationEnabled(true);
    LatLng bangalore = new LatLng(12.9667, 77.5667);
    mMap.addMarker(new MarkerOptions().position(bangalore).title("Bengaluru"));
    float zoomLevel = 12;
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(bangalore, zoomLevel));
}

答案 3 :(得分:0)

查看我为此目的构建的ApacheCLI PHP Docker镜像,为官方PHP 5.6 docker库添加HTTP / 2支持。这消除了任何HTTP/2 client preface string missing or corrupt错误。

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