PHP 8.5: Curl: новая функция curl_multi_get_handles

В PHP 8.5 расширение cURL получило улучшение, которое делает работу с многопоточными запросами проще. Функция 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, это изменение не вызывает проблем с обратной совместимостью.

Обратите внимание, что функция 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]

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: Новая INI-директива max_memory_limit

Следующая Статья

PHP 8.5: Intl: новый класс IntlListFormatter