编程

PHP 8.5: Curl: 新增 curl_multi_get_handles 函数

13 2024-12-05 01:19:00
PHP 8.5 是当前活跃的开发分支,预计将于 2025 年 11 月发布。本系列文章将提供 PHP 8.5 中将会出现的一些新特性、更新及弃用进行预览。

PHP 8.5 中的 Curl 扩展添加了一个名为 curl_multi_get_handles 的新函数,该函数从 CurlMultiHandle 对象返回一个 CurlHandle 对象数组。

新曾的 curl_multi_get_handles 函数是完善了现有的函数,以在 CurlMultiHandle 对象中添加 (curl_multi_add_handle) 和删除(curl_multi_remove_handle)  CurlMultiHandle 对象。

如果没有此功能,要检索添加到  CurlMultiHandle 中的 CurlHandle 对象,应用程序必须维护一个 CurlHandle 对象列表,最好在 WeakMap 中。使用 WeakMap,CurlHandle 对象可以自由销毁,而无需将 WeakMap 对象中的使用作为引用计算在内。

$cm = curl_multi_init();
curl_multi_get_handles($cm);
// Empty array

$ch1 = curl_init('https://example.com/foo');
$ch2 = curl_init('https://example.com/bar');

curl_multi_add_handle($cm, $ch1);
curl_multi_add_handle($cm, $ch2);

curl_multi_get_handles($cm);
// [$ch1, $ch2]

curl_multi_get_handles 函数摘要

/**
 * Get a list of CurlHandle objects in a given
 * CurlMultiHandle object
 *
 * @param CurlMultiHandle $multi_handle
 * @return array
 */
function curl_multi_get_handles(CurlMultiHandle $multi_handle): array {}
  • curl_multi_get_handles 函数在全局命名空间中进行了声明
  • 如果 CurlMultiHandle 中不包含 CurlHandle 对象,它将返回空数组。

向后兼容性影响

除非应用声明了它自己的 curl_multi_get_handles 函数,否则该特性不会带来任何向后兼容性问题。

请注意 libcurl 的 curl_multi_get_handles 提供了类似的功能,但它只在 libcurl 8.4 及之后的版本中可用。而 PHP 的 curl_multi_get_handles 实现并不依赖于该 libcurl 函数。

这个 curl_multi_get_handles 函数不能很容易地使用用户空间 PHP 进行 polyfill。但是,可以通过将 CurlHandle 对象单独存储在 PHP 数组中,或者理想情况下存储在 WeakMap 中来模拟此功能。

$cm = curl_multi_init();
$handleMap = new WeakMap();

$ch1 = curl_init('https://example.com/foo');
$ch2 = curl_init('https://example.com/bar');

curl_multi_add_handle($cm, $ch1);
curl_multi_add_handle($cm, $ch2);
$handleMap[$ch1] = 1;
$handleMap[$ch2] = 2;

$handles = [];
foreach($handleMap as $ch => $noop) {
    $handles[] = $ch;
}

$handles;
// [$ch1, $ch2]