Мой текущий скрипт для загрузки фотографий выглядит так:
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')
Как мне это сделать?
Спасибо!
По сути, это можно сделать, создав дескрипторы в массиве с именами файлов в качестве ключей, а затем считав результаты в другой массив с теми же ключами.
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);
Других решений пока нет …