6、PHP 8.4 新特性 - 新增 CURL_HTTP_VERSION_3 和 CURL_HTTP_VERSION_3ONLY 常量以支持 HTTP 3

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 163

时间: 2025-01-18 09:42:51

PHP 的 cURL 扩展能够发起 HTTP/3(也称为 QUIC)HTTP 请求,前提是 cURL 扩展在编译时包含了支持 HTTP/3 所需的依赖库。

在 PHP 8.4 中,cURL 扩展要求 libcurl 版本为 7.61.0 或更高版本。要启用 cURL 对 HTTP/3 的支持,需要 libcurl 版本为 7.66.0 或更高版本。

自 PHP 8.2 及更高版本开始,可以通过向 CURLOPT_HTTP_VERSION cURL 选项传递正确的参数来启用 HTTP/3 支持。

在 PHP 8.4 中,cURL 扩展声明了以下两个新的 PHP 常量,这些常量可以作为 CURLOPT_HTTP_VERSION cURL 选项的参数使用:

  • CURL_HTTP_VERSION_3(值为 int 30),自 libcurl >= 7.66.0 开始可用
  • CURL_HTTP_VERSION_3ONLY(值为 int 31),自 libcurl >= 7.88.0 开始可用

需要注意的是,在 PHP 8.2 及更高版本中,可以启用 HTTP/3 支持。PHP 8.4 的唯一区别在于,上述值被声明为 PHP 常量。

$ch = curl_init("https://ziruchu.com");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3);
curl_exec($ch);

如果 Curl 扩展没有内置 HTTP/3 支持,那么 curl_setopt 函数调用会返回 false,并且 CURLOPT_HTTP_VERSION 选项将保持默认值,或者如果之前已经设置过,则保持现有的值。

CURL_HTTP_VERSION_3

当 Curl 选项 CURLOPT_HTTP_VERSION 设置为 CURL_HTTP_VERSION_3 时,Curl 将尝试使用 HTTP/3 进行请求。如果失败,它将回退到早期的 HTTP 版本。这是启用HTTP/3的典型且理想的方法,因为它采取了机会主义的方法来启用 HTTP/3。

CURL_HTTP_VERSION_3 常量被分配了整数值 30。

CURL_HTTP_VERSION_3ONLY

当 Curl 选项 CURLOPT_HTTP_VERSION 设置为 CURL_HTTP_VERSION_3ONLY 时,Curl 将尝试使用 HTTP/3。如果主机不支持 HTTP/3,请求将失败。

CURL_HTTP_VERSION_3ONLY常量被分配了整数值 31。

HTTP3 案例

<?php

declare(strict_types=1);

// 检查PHP版本和Curl扩展是否支持HTTP/3
if (PHP_VERSION_ID < 80400 || !function_exists('curl_version') || !defined('CURL_HTTP_VERSION_3')) {
    die("PHP 8.4 or newer with Curl HTTP/3 support is required.\n");
}

$url = 'https://ziruchu.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);

// 设置HTTP版本为HTTP/3或仅在支持时使用HTTP/3
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3);
// 或者使用以下行来仅在服务器支持HTTP/3时使用它
// curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3ONLY);


$response = curl_exec($ch);

// 检查是否有错误发生
if ($response === false) {
    $error = curl_error($ch);
    curl_close($ch);
    die("Curl error: $error\n");
}

// 输出响应内容
echo "Response from server:\n";
echo $response;

curl_close($ch);

向后兼容性影响

CURL_HTTP_VERSION_3 和 CURL_HTTP_VERSION_3ONLY 是在全局命名空间中声明的两个新的 PHP 常量。 除非用户级的 PHP 应用程序声明了相同的常量,否则这一变化不会引起任何向后兼容性问题。

在 PHP 8.2 及更高版本中,可以轻松地为这两个新常量提供 polyfill(兼容性补丁)。虽然不推荐这样做,但也可以通过直接传递这些常量的整数值来启用HTTP/3支持。

if (curl_version()['version'] >= 0x075800) {
    define('CURL_HTTP_VERSION_3', 30);
    define('CURL_HTTP_VERSION_3ONLY', 31);
}
请登录后再评论