更新时间:2026-06-30 GMT+08:00

批量恢复归档存储对象

开发过程中,您有任何问题可以在GitHub上提交issue接口参考文档详细介绍了每个接口的参数和使用方法。

示例代码

本示例用于批量恢复归档存储的对象。 归档类型的对象处于冷冻状态无法直接访问,需要先提交恢复请求,等待恢复完成后才能访问。存储恢复通常需要3~5小时(标准模式),深度归档存储恢复通 常需要12~48小时(批量模式),恢复时间因恢复选项不同而异。

<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      // endpoint填写Bucket对应的Endpoint, 此处以中国-香港为例,其他地区请按实际情况填写。
       'endpoint' => "obs.ap-southeast-1.myhuaweicloud.com",
      'signature' => 'obs'
] );

$bucketName = 'bucketname';
$concurrency = 5;
// Days指定恢复后对象的可访问天数,归档存储最小1天,深度归档存储最小1天
$restoreDays = 30;

// 列举桶中所有对象,过滤出归档或深度归档存储类别
// 如需仅恢复指定前缀的对象,请在listObjects中设置Prefix参数
$isTruncated = true;
$marker = null;
$archiveObjects = [];

while ($isTruncated) {
       $resp = $obsClient->listObjects ( [
              'Bucket' => $bucketName,
              'Marker' => $marker
       ] );
       if (!empty($resp['Contents'])) {
              foreach ($resp['Contents'] as $content) {
                     $storageClass = isset($content['StorageClass']) ? $content['StorageClass'] : 'STANDARD';
                     if ($storageClass === 'COLD' || $storageClass === 'ARCHIVE' || $storageClass === 'DEEP_ARCHIVE') {
                            $archiveObjects[] = ['Key' => $content['Key'], 'StorageClass' => $storageClass];
                     }
              }
       }
       $isTruncated = $resp['IsTruncated'];
       $marker = $resp['NextMarker'];
}
printf("Found %d archive objects to restore\n\n", count($archiveObjects));

// 并发恢复归档对象
// 生产环境建议增加重试机制,避免网络波动或临时故障导致恢复不完整   

$successCount = 0;
$failCount = 0;

$promiseGenerator = function () use ($obsClient, $bucketName, $archiveObjects, $restoreDays, &$successCount, &$failCount) {
       foreach ($archiveObjects as $object) {
              // 恢复前建议先通过getObjectMetadata检查对象的Restore头域,判断恢复状态
              // 若对象已恢复且仍在有效期内,可跳过或仅延长有效期
              // 根据存储类型选择恢复选项:归档存储使用标准恢复,深度归档存储使用批量恢复
              $tier = ($object['StorageClass'] === 'DEEP_ARCHIVE')
                     ? ObsClient::RestoreTierBulk
                     : ObsClient::RestoreTierStandard;
              yield $obsClient->restoreObjectAsync ( [
                     'Bucket' => $bucketName,
                     'Key' => $object['Key'],
                     'Days' => $restoreDays,
                     'Tier' => $tier
              ], function ($exception, $resp) use ($object, &$successCount, &$failCount) {
                     if ($exception === null) {
                            printf ( "Key:%s, StorageClass:%s, RequestId:%s\n", $object['Key'], $object['StorageClass'], $resp['RequestId'] );
                            $successCount++;
                     } else {
                            printf ( "RestoreFailed: Key:%s, Status:%d, Message:%s\n", $object['Key'], $exception->getStatusCode(), $exception->getExceptionMessage() );
                            $failCount++;
                     }
              } );
       }
};

$eachPromise = new EachPromise($promiseGenerator(), [
       'concurrency' => $concurrency
]);

$eachPromise->promise()->wait();

printf("\nResult: success=%d, fail=%d\n", $successCount, $failCount);

重复恢复归档存储数据时在延长恢复有效期的同时,也将会对恢复时产生的恢复费用进行重复收取。产生的标准存储类别的对象副本有效期将会延长,并且收取延长时间段产生的标准存储副本费用。