Нужна помощь с использованием multi curl в php для загрузки файлов

Мой текущий скрипт для загрузки фотографий выглядит так:

foreach($files as $file) {
$data = base64_encode(file_get_contents($file));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
}

У меня может быть до 1000 файлов для загрузки на удаленный сервер, и может потребоваться много времени, чтобы curl все обработал. Решение кажется многоуровневым, но есть один уникальный аспект:

что мне нужно от multi-curl, чтобы сохранить ответ в массив, как $upload_results[] = array($file, 'response')

Как мне это сделать?

Спасибо!

0

Решение

По сути, это можно сделать, создав дескрипторы в массиве с именами файлов в качестве ключей, а затем считав результаты в другой массив с теми же ключами.

function uploadLotsOfFiles($files) {
$mh = curl_multi_init();
$handles = array();
$results = array();

foreach ($files as $file) {
$handles[$file] = curl_init();
curl_setopt($handles[$file], CURLOPT_RETURNTRANSFER, true);

//File reading code and other options from your question go here

curl_multi_add_handle($mh, $handles[$file]);
}

$running = 0;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh); //Prevent eating CPU
} while($running > 0);
foreach($handles as $file => $handle) {
$results[$file] = curl_multi_getcontent($handle);
curl_multi_remove_handle($mh, $handle);
}
return $results;
}

Если вам действительно нужен результат в указанном вами формате (что я не рекомендую, поскольку он менее элегантен, чем использование файла в качестве ключа):

$results[] = array($file, curl_multi_getcontent($handle));

Может быть использован вместо $results[$file] = curl_multi_getcontent($handle);

0

Другие решения

Других решений пока нет …