【问题标题】:Make HTTP/2 request with PHP使用 PHP 发出 HTTP/2 请求
【发布时间】:2016-09-05 13:33:06
【问题描述】:

有没有办法强制 PHP 与另一台服务器建立 HTTP2 连接,以查看该服务器是否支持它?

我试过了:

$options = stream_context_create(array(
               'http' => array(
                    'method' => 'GET',
                    'timeout' => 5,
                    'protocol_version' => 1.1
                )
              ));
$res = file_get_contents($url, false, $options);
var_dump($http_response_header);

并尝试过:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 3);
$response = curl_exec($ch);
var_dump($response);
curl_close($ch);

但如果我使用以下 URL https://www.google.com/#q=apache+2.5+http%2F2,两种方式都会给我一个 HTTP1.1 响应

我从启用了 HTTP/2 + SSL 的域发送请求。我做错了什么?

【问题讨论】:

标签: php curl http2


【解决方案1】:

据我所知,cURL 是 PHP 中唯一支持 HTTP 2.0 的传输方法。

您首先需要测试您的 cURL 版本是否支持它,然后设置正确的版本标头:

if (
    defined("CURL_VERSION_HTTP2") &&
    (curl_version()["features"] & CURL_VERSION_HTTP2) !== 0
) {
    $url = "https://www.google.com/";
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL            =>$url,
        CURLOPT_HEADER         =>true,
        CURLOPT_NOBODY         =>true,
        CURLOPT_RETURNTRANSFER =>true,
        CURLOPT_HTTP_VERSION   =>CURL_HTTP_VERSION_2_0,
    ]);
    $response = curl_exec($ch);
    if ($response !== false && strpos($response, "HTTP/2") === 0) {
        echo "HTTP/2 support!";
    } elseif ($response !== false) {
        echo "No HTTP/2 support on server.";
    } else {
        echo curl_error($ch);
    }
    curl_close($ch);
} else {
    echo "No HTTP/2 support on client.";
}

【讨论】:

  • 根据您的平台/版本,可能需要进行一些调整才能完成,就像我对它所做的那样:[stackoverflow.com/a/45110402/1005334]
  • 知道为什么 CLI 请求(如 curl --http2 -I https://nghttp2.org/)在 HTTP2 模式下工作,但在切换到 PHP 时,它们被作为 HTTP 1.1 发送?我已经测试了您的代码,但它仍然无法在 HTTP2 模式下运行。我有 PHP 5.6 和 curl 7.54。
  • @Andrew 因为您在命令行中使用的 curl 不一定与 PHP 中的 curl 支持相同。
  • 次要版本 (2.0) 从 HTTP2 中删除。 http2.github.io/faq/#is-it-http20-or-http2
  • 感谢@Ryre 的编辑。当然,此代码将继续与仍然发送“2.0”的旧服务器一起使用。
猜你喜欢
  • 2020-08-21
  • 2022-01-19
  • 2011-05-24
  • 2016-12-18
  • 2017-10-05
  • 2021-12-29
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多