Как загрузить файл .tar.gz в Amazon Glacier с помощью PHP и aws-SDK v2 с многочастной загрузкой?

Я пытаюсь загрузить файл .tar.gz размером 9 ГБ, который я создал с помощью мастера резервного копирования CPanel. Этот файл должен храниться как есть на Amazon Glacier, но Amazon Glacier имеет ограничение на загрузку 4 ГБ.

Есть ли способ сделать это с помощью PHP, aws-SDK v2 и uploadMultipartPart?

Это код, который я получил до сих пор:

<?php
require 'aws-autoloader.php';

use Aws\Glacier\GlacierClient;
use Aws\Glacier\Model\MultipartUpload\UploadPartGenerator;

//#####################################################################
//SET AMAZON GLACIER VARIBALES
//#####################################################################
$key = 'XXXXXXXXXXXXXXXXX';
$secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$region = 'us-west-2';
$accountId = 'XXXXXXXXXXXX';
$vaultName = 'XXXXXXXXXXXX';
$partSize = 4 * 1024 * 1024;
$fileLocation = 'path/to/.tar.gz file/';

//#####################################################################
//DECLARE THE AMAZON CLIENT
//#####################################################################
$client = GlacierClient::factory(array(
'key'    => $key,
'secret' => $secret,
'region' => $region,
));

//#####################################################################
//GET ALL FILES INTO AN ARRAY
//#####################################################################
$files = scandir($fileLocation);
$filename = $files[2];

//#####################################################################
// USE HELPERS IN THE SDK TO GET INFORMATION ABOUT EACH OF THE PARTS
//#####################################################################
$archiveData = fopen($fileLocation.$filename, 'r');
$parts = UploadPartGenerator::factory($archiveData, $partSize);

//#####################################################################
// INITIATE THE UPLOAD AND GET THE UPLOAD ID
//#####################################################################
$result = $client->initiateMultipartUpload(array(
'vaultName' =>$vaultName,
'partSize'  => $partSize,
));
$uploadId = $result->get('uploadId');

//#####################################################################
// UPLOAD EACH PART INDIVIDUALLY USING DATA FROM THE PART GENERATOR
//#####################################################################
$archiveData = fopen($fileLocation.$filename, 'r');
foreach ($parts as $part) {
set_time_limit (120);
fseek($archiveData, $part->getOffset());
$client->uploadMultipartPart(array(
'vaultName'     => $vaultName,
'uploadId'      => $uploadId,
'body'          => fread($archiveData, $part->getSize()),
'range'         => $part->getFormattedRange(),
'checksum'      => $part->getChecksum(),
'ContentSHA256' => $part->getContentHash(),
));
}

//#####################################################################
// COMPLETE THE UPLOAD BY USING DATA AGGREGATED BY THE PART GENERATOR
//#####################################################################
$result = $client->completeMultipartUpload(array(
'vaultName'   => $vaultName,
'uploadId'    => $uploadId,
'archiveSize' => $parts->getArchiveSize(),
'checksum'    => $parts->getRootChecksum(),
));
$archiveId = $result->get('archiveId');

fclose($archiveData);
?>

2

Решение

Заметка partSize должно быть n * 1024 * 1024, где n — степень 2. Вы используете 104857600 = 100 * 1024 * 1024. Ваш n — четное число, а не степень двух. http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-initiate-upload.html

У меня нет полного ответа, но вы можете указать, какую ошибку вы получаете.

Также из документов: «Минимально допустимый размер детали составляет 1 МБ, а максимальный — 4 ГБ (4096 МБ)». Другими словами, n> = 1, n <= 4096, а n — это степень 2. Так какое же число лучше использовать? я считать идея состоит в том, чтобы использовать меньшее n, если у вас есть проблемы, с учетом этих ограничений:

  • Вы платите за часть: $ 0,050 за 1000 запросов в США-Восток.

  • Там максимальное количество частей: 10000. При загрузке в 9 ГБ размер части составляет 966367 ~ 0,9 МБ, если используется максимальное количество частей. Таким образом, 0,9 МБ — минимальный размер детали для 9 ГБ. Вы вправе захотеть использовать больший размер детали, чем 1 МБ, чтобы не выходить за рамки.

  • Есть причина не использовать слишком большие размеры деталей. Это как-то связано с памятью, процессором и насыщением вашего интернет-соединения. Все, что я могу действительно сказать, — то, что программное обеспечение, которое я использую, по умолчанию составляет 16 МБ. Вот обсуждение компромиссов на его проблем трекера: https://github.com/vsespb/mt-aws-glacier/issues/55

0

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

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