6、PHP 8.4 新特性 - 新增 CURL_HTTP_VERSION_3 和 CURL_HTTP_VERSION_3ONLY 常量以支持 HTTP 3
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);
}