PHP 8.5: Curl: новая функция curl_multi_get_handles
curl_multi_get_handles позволяет напрямую получить список всех добавленных CurlHandle, чего раньше катастрофически не хватало.В PHP 8.5 в расширении cURL добавлена функция curl_multi_get_handles для обработки множественных curl-запросов, возвращающая массив объектов CurlHandle из объекта CurlMultiHandle.
Функция curl_multi_get_handles дополняет существующие функции добавления (curl_multi_add_handle) и удаления (curl_multi_remove_handle) объектов CurlHandle в/из объекта CurlMultiHandle.
До появления новой функции PHP cURL разработчикам приходилось вручную поддерживать список объектов CurlHandle, если они хотели получить их из CurlMultiHandle. Это усложняло код и требовало дополнительного использования WeakMap для получения списка curl-handle.
$cm = curl_multi_init();
curl_multi_get_handles($cm);
// Пустой массив
$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
/**
* Получение списка объектов CurlHandle в заданном объекте CurlMultiHandle
*
* @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 и более поздних версиях. Реализация curl_multi_get_handles в PHP не зависит от данной функции libcurl.
Функцию curl_multi_get_handles нельзя просто заменить с помощью пользовательского PHP-кода. Однако можно имитировать эту функциональность, сохраняя объекты 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]