PHP 8.5: Curl: 新增 curl_multi_get_handles 函数
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]