如何使用 PHP 和带有分段上传的 aws-SDK v2 将 .tar.gz 文件上传到 Amazon Glacier?
How to upload a .tar.gz file into Amazon Glacier using PHP and aws-SDK v2 with multipart upload?
我正在尝试上传我使用 CPanel 备份向导创建的 9GB .tar.gz 文件。此文件应按原样存储在 Amazon Glacier 上,但 Amazon Glacier 的上传限制为 4GB。
有没有办法使用 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);
?>
注意 partSize
需要是 n * 1024 * 1024,其中 n 是 2 的幂。您使用的是 104857600 = 100 * 1024 * 1024。您的 n 是偶数,而不是幂两个。 http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-initiate-upload.html
我没有完整的答案,但你可以指定你遇到的错误。
也来自文档:"The minimum allowable part size is 1 MB, and the maximum is 4 GB (4096 MB)." 换句话说,n >=1,n <= 4096,n 是 2 的幂。那么使用什么数字比较合适?我 认为 如果遇到问题,我的想法是使用较小的 n,但要遵守以下限制:
您按每个部分付费:美国东部每 1,000 个请求 0.050 美元。
零件数量上限:10,000。对于 9 GB 的上传,如果您使用最大部分数,则部分大小为 966367 ~ 0.9 MB。因此 0.9 MB 是 9 GB 的最小部分大小。您希望使用大于 1 MB 的部分大小以轻松控制在限制范围内是正确的。
不使用过大的零件尺寸是有原因的。它与内存、CPU 和使您的互联网连接饱和有关。我只能说我使用的软件默认为 16 MB。这是对其问题跟踪器的权衡的讨论:https://github.com/vsespb/mt-aws-glacier/issues/55
我正在尝试上传我使用 CPanel 备份向导创建的 9GB .tar.gz 文件。此文件应按原样存储在 Amazon Glacier 上,但 Amazon Glacier 的上传限制为 4GB。
有没有办法使用 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);
?>
注意 partSize
需要是 n * 1024 * 1024,其中 n 是 2 的幂。您使用的是 104857600 = 100 * 1024 * 1024。您的 n 是偶数,而不是幂两个。 http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-initiate-upload.html
我没有完整的答案,但你可以指定你遇到的错误。
也来自文档:"The minimum allowable part size is 1 MB, and the maximum is 4 GB (4096 MB)." 换句话说,n >=1,n <= 4096,n 是 2 的幂。那么使用什么数字比较合适?我 认为 如果遇到问题,我的想法是使用较小的 n,但要遵守以下限制:
您按每个部分付费:美国东部每 1,000 个请求 0.050 美元。
零件数量上限:10,000。对于 9 GB 的上传,如果您使用最大部分数,则部分大小为 966367 ~ 0.9 MB。因此 0.9 MB 是 9 GB 的最小部分大小。您希望使用大于 1 MB 的部分大小以轻松控制在限制范围内是正确的。
不使用过大的零件尺寸是有原因的。它与内存、CPU 和使您的互联网连接饱和有关。我只能说我使用的软件默认为 16 MB。这是对其问题跟踪器的权衡的讨论:https://github.com/vsespb/mt-aws-glacier/issues/55