Мне нужно загрузить большое количество больших файлов, хранящихся на нескольких одинаковых серверах. Файл, например «5.doc», который хранится на сервере 3, также сохраняется на сервере 55.Определить, какое обещание не удалось и динамически изменить очередь обещаний в Guzzle 6
Чтобы ускорить это, вместо того, чтобы использовать только один сервер для загрузки всех файлов один за другим, м, используя все серверы одновременно. Проблема в том, что один из серверов может быть намного медленнее, чем другие, или даже может быть отключен. При использовании файлов загрузки 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
}
}
}
В настоящее время я устанавливаю неудавшийся идентификатор сервера как заголовок, который затем можно получить через $ e-> getRequest() -> getHeaders() [] [0]. (временное решение) –