编程

PHP 8.4: Curl: curl_version() 支持 feature_list

377 2024-04-14 20:29:00

Curl 扩展的 curl_version 函数返回包含 Curl 版本及编译信息的关联数组。包括 Curl 版本、SSL 库名及版本、Brotli 和 libz 版本、Curl 支持的协议列表以及 Curl 支持的所有特性的位掩码(bitmask)。

功能的位掩码不便于发现,也不便于检查 Curl 中是否支持特定功能(如HTTP/2、HSTS等)。

在 PHP 8.4 中,curl_version 函数返回一个额外的数组键称为 feature_list,这是一个 Curl 特性数组,说明是否支持这些特性。

curl_version();
[
    "version_number" => 524801,
    "age" => 10,
    "features" => 1438631837,
+    "feature_list" => [
+      "AsynchDNS" => true,
+      "CharConv" => false,
+      "Debug" => false,
+      // ...
+      "HTTP2" => true,
+      "HTTPS_PROXY" => true,
+      "BROTLI" => true,
+      "ALTSVC" => true,
+      "HTTP3" => false,
+      "ZSTD" => true,
+      "HSTS" => true,
+      // ...
+    ],
    "ssl_version_number" => 0,
    "version" => "8.2.1",
    "host" => "x86_64-pc-linux-gnu",
    // ...
  ]

特性列表是一个简单的键值对数组,键是特性名,值是布尔值说明是否支持该特性。

这使它在检查 Curl 中是否支持某些功能时更具可读性。

比如,要检测是否支持 HTTP/3,它需要 CURL_VERSION_ 常量的可用性,并检测 features 位掩码。在 PHP 8.4 及之后的版本,则只需要检测 feature_list 数组:

  // Check if HTTP/3 is supported in Curl
- defined('CURL_VERSION_HTTP3') && (curl_version()['features'] & CURL_VERSION_HTTP3 === CURL_VERSION_HTTP3)
+ !empty(curl_version()['feature_list']['HTTP3']);

关联变更

向后兼容性影响

PHP 8.4 及此后的版本调用 curl_version() 函数将返回一个新增 feature_list 值。此功能无法移植到较旧的PHP版本。

为了在检查某个 Curl 功能是否可用时实现跨版本兼容性,请检查是否声明了相关的 CURL_VERSION_* 常量,以及 curl_version()['feature'] 位掩码是否包含该值