我需要下载大量存储在多个相同服务器上的大文件。存储在服务器 3 上的文件(如“5.doc”)也存储在服务器 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
}
}
}