Мне нужно загрузить большое количество больших файлов, хранящихся на нескольких одинаковых серверах. Файл, такой как «5.doc», который хранится на сервере 3, также хранится на сервере 55.
Чтобы ускорить это, вместо того, чтобы использовать только один сервер для загрузки всех файлов один за другим, я использую все серверы одновременно. Проблема в том, что один из серверов может работать намного медленнее других или вообще быть недоступен. При использовании Guzzle для пакетной загрузки файлов все файлы в этом пакете должны быть загружены до начала следующего пакета.
Есть ли способ немедленно начать загрузку другого файла вместе с другими, чтобы все серверы постоянно загружали файл?
Если сервер не работает, я установил тайм-аут в 300 секунд, и когда он будет достигнут, Guzzle перехватит исключение ConnectionException.
Как определить, какие обещания (загрузки) не удалось выполнить, чтобы отменить их? Могу ли я получить информацию о том, какой файл/сервер вышел из строя?
Ниже приведен упрощенный пример кода, который я использую для иллюстрации. Спасибо за помощь!
$filesToDownload = [['5.doc', '8.doc', '10.doc'], ['1.doc', '9.doc']]; //The file names that we need to download
$availableServers = [3, 55, 88]; //Server id's that are available
foreach ($filesToDownload as $index => $fileBatchToDownload) {
$promises = [];
foreach ($availableServers as $key => $availableServer) {
array_push(
$promises, $client->requestAsync('GET', 'http://domain.com/' . $fileBatchToDownload[$index][$key], [
'timeout' => 300,
'sink' => '/assets/' . $fileBatchToDownload[$index][$key]
])
);
$database->updateRecord($fileBatchToDownload[$index][$key], ['is_cached' => 1]);
}
try {
$results = Promise\unwrap($promises);
$results = Promise\settle($promises)->wait();
} catch (\GuzzleHttp\Exception\ConnectException $e) {
//When can't connect to the server or didn't download within timeout
foreach ($e->failed() as $failedPromise) {
//Re-set record in database to is_cached = 0
//Delete file from server
//Remove this server from the $availableServers list as it may be down or too slow
//Re-add this file to the next batch to download $filesToDownload
}
}
}