[英]How do I send a HTTP/2 POST request in PHP
我在Ruby中发送HTTP / 2 POST请求时发现了类似的问题,但我想用PHP更新服务器
此处描述了基于HTTP / 2的新Apple推送通知API: https : //developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html
具有HTTP / 2经验的任何人都可以帮助我以PHP的客户端身份进行请求。
PHP> = 5.5.24的CURL扩展支持HTTP / 2。 (由于此提交 )
您还需要安装libcurl(curl函数使用的基础库)并启用HTTP / 2支持。 这意味着libcurl比7.38.0更新,但实际上,更新越好。 必须在编译时使用--with-nghttp2
标志,在显式启用HTTP / 2支持--with-nghttp2
。
只需CURL_HTTP_VERSION_2_0
使用CURLOPT_HTTP_VERSION
,然后通过传入CURL_HTTP_VERSION_2_0
来将CURLOPT_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 Push Notification Service)发出请求,则会收到类似以下的错误消息:
?@@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f616538666562613534
由于curl是libcurl的绑定 ,因此还必须启用curl并启用http / 2。
有关示例代码,请在此处查看我对类似问题的回答
有关安装过程,您可以按照本教程进行操作
当前,PHP中没有直接的HTTP/2
支持。
有一个想法可以在将来直接向PHP添加这样的支持: https : //wiki.php.net/ideas/php6#http2_support
如果安装了正确的php和curl版本,则第三方库Guzzle https://github.com/guzzle/guzzle支持HTTP / 2:
use GuzzleHttp\Client;
$client = new Client();
$client->get('https://http2.akamai.com/demo/tile-0.png', [
'version' => 2.0,
'debug' => true,
]);
查看我为此目的构建的Apache和CLI PHP Docker映像,这些映像将HTTP / 2支持添加到了官方PHP 5.6 docker库中。 这消除了所有HTTP/2 client preface string missing or corrupt
错误。
在拥有正确的环境之后,尝试了多个PHP的JWS / JWT库后,我才发现Spomky-Labs / jose可与APN完美配合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.