全部產品
Search
文件中心

Object Storage Service:資料複製(PHP SDK V2)

更新時間:Aug 05, 2025

資料複製是以非同步(近即時)方式將源Bucket中的檔案(Object)以及對Object的建立、更新和刪除等操作自動複製到目標Bucket。OSS支援跨地區複製(Cross-Region Replication)和同地區複製(Same-Region Replication)。

注意事項

  • 本文範例程式碼以華東1(杭州)的地區IDcn-hangzhou為例,預設使用外網Endpoint,如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱

  • 阿里雲帳號預設擁有資料複製的相關許可權。如果您希望通過RAM使用者或者STS的方式執行資料複製相關操作,例如:

    • 開啟資料複製,您必須擁有oss:PutBucketReplication許可權。

    • 開啟或關閉資料複製時間控制(RTC)功能,您必須擁有oss:PutBucketRtc許可權。

    • 查看資料複製規則,您必須擁有oss:GetBucketReplication許可權。

    • 查看可複製的目標地區,您必須擁有oss:GetBucketReplicationLocation許可權。

    • 查看資料複製進度,您必須擁有oss:GetBucketReplicationProgress許可權。

    • 關閉資料複製,您必須擁有oss:DeleteBucketReplication許可權

範例程式碼

開啟資料複製

重要

開啟資料複製前,請確保源儲存空間與目標儲存空間同時處於非版本化或已啟用版本控制狀態。

以下代碼用於開啟資料複製,將源Bucket中的資料複製到相同或不同地區下的目標Bucket。

<?php

// 引入 Composer 自動負載檔案,確保 SDK 和其他依賴可以被正確載入
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間
use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數說明和是否為必填項
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
    "target-bucket" => ['help' => 'The name of the target bucket', 'required' => True],
    "target-location" => ['help' => 'The location of the target bucket', 'required' => True],
];

// 構建 getopt 所需的長選項數組格式:如 ["region:", "endpoint:", ...]
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的參數
$options = getopt("", $longopts);

// 檢查所有必填參數是否都已提供,若缺失則輸出錯誤資訊並退出
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數值
$region = $options["region"];
$bucket = $options["bucket"];
$targetBucket = $options["target-bucket"];
$targetLocation = $options["target-location"];

// 使用環境變數中的憑證資訊(例如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證提供者、地區和可選的 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構造 PutBucketReplication 請求對象
$request = new Oss\Models\PutBucketReplicationRequest(
    bucket: $bucket,
    replicationConfiguration: new Oss\Models\ReplicationConfiguration(
        rules: array(
            new Oss\Models\ReplicationRule(
                destination: new Oss\Models\ReplicationDestination(
                    bucket: $targetBucket,
                    location: $targetLocation,
                ),
                rtc: new Oss\Models\ReplicationTimeControl(
                    status: 'enabled' // 啟用複製時間控制(RTC)
                )
            )
        )
    )
);

// 執行請求並擷取結果
$result = $client->putBucketReplication($request);

// 輸出響應的狀態代碼、請求ID和複製規則ID
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL .
    'replication rule id:' . $result->replicationRuleId
);

查看資料複製規則

以下代碼用於查看Bucket的資料複製規則。

<?php

// 引入 Composer 的自動負載檔案,確保 SDK 和依賴類可以被正確載入
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間並簡寫為 Oss
use AlibabaCloud\Oss\V2 as Oss;

// 解析命令列參數的描述定義
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
];

// 將參數鍵轉換為 getopt 所需的格式(如:"region:")
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的長選項參數
$options = getopt("", $longopts);

// 遍曆所有參數定義,檢查必填項是否都已提供
foreach ($optsdesc as $key => $value) {
    // 如果是必填項且未提供,則輸出錯誤資訊並退出
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數中的 region 和 bucket 名稱
$region = $options["region"];
$bucket = $options["bucket"];

// 從環境變數中載入訪問憑證(如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入 SDK 預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證、地區以及可選的自訂 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構建 GetBucketReplication 請求對象
$request = new Oss\Models\GetBucketReplicationRequest(bucket: $bucket);

// 發送請求並擷取響應結果
$result = $client->getBucketReplication($request);

// 輸出響應的狀態代碼、請求 ID 和複製規則
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL .
    'replication config:' . var_export($result->replicationConfiguration, true)
);

設定資料複製時間控制(RTC)

以下代碼用於為已有的跨地區複製規則開啟或關閉資料複製時間控制(RTC)功能。

<?php

// 引入 Composer 的自動負載檔案,用於載入 SDK 和依賴類
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間,並簡寫為 Oss
use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數及其說明和是否必填
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
    "rule-id" => ['help' => 'The replication rule id of the bucket', 'required' => True],
];

// 將參數鍵轉換為 getopt 所需的格式(帶冒號表示需要值)
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的長選項參數
$options = getopt("", $longopts);

// 檢查所有必填參數是否都已提供
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數中的 region、bucket 和 rule-id
$region = $options["region"];
$bucket = $options["bucket"];
$ruleId = $options["rule-id"];

// 從環境變數中載入訪問憑證(如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入 SDK 預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證提供者、地區和可選的自訂 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構建 PutBucketRtcRequest 請求對象
$request = new Oss\Models\PutBucketRtcRequest(
    bucket: $bucket,
    rtcConfiguration: new Oss\Models\RtcConfiguration(
        rtc: new Oss\Models\ReplicationTimeControl(
            status: 'disabled' // 禁用 RTC 功能
        ),
        id: $ruleId // 指定要修改的複製規則ID
    )
);

$result = $client->putBucketRtc($request);

// 輸出響應的狀態代碼和請求ID
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId
);

查看可複製的目標地區

以下代碼用於查看Bucket的資料可複製的目標地區列表。

<?php

// 引入 Composer 自動負載檔案,確保 SDK 和依賴類可以被正確載入
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間,並簡寫為 Oss
use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數及其說明和是否必填
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
];

// 將參數鍵轉換為 getopt 所需的格式,如 "region:"
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的長選項參數
$options = getopt("", $longopts);

// 遍曆參數定義,檢查所有必填項是否已提供
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數中的 region 和 bucket 名稱
$region = $options["region"];
$bucket = $options["bucket"];

// 從環境變數中載入訪問憑證(如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入 SDK 預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證提供者、地區和可選的自訂 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構建 GetBucketReplicationLocation 請求對象,用於擷取可用的複製目的地區域列表
$request = new Oss\Models\GetBucketReplicationLocationRequest(bucket: $bucket);

// 發送請求並擷取響應結果
$result = $client->getBucketReplicationLocation($request);

// 輸出響應的狀態代碼、請求 ID 和返回的複製地區資訊
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL .
    'replication location:' . var_export($result->replicationLocation, true)
);

查看資料複製進度

說明

資料複製進度分為歷史資料複製進度和新寫入資料複製進度。

  • 歷史資料複製進度用百分比表示,僅對開啟了歷史資料複製的儲存空間有效。

  • 新寫入資料複製進度用新寫入資料的時間點表示,代表這個時間點之前的資料已複製完成。

以下代碼用於查看Bucket中指定規則ID的資料複製進度。

<?php

// 引入 Composer 自動負載檔案,用於載入 SDK 和依賴類
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間,並簡寫為 Oss
use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數及其說明和是否必填
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
    "rule-id" => ['help' => 'The replication rule id of the bucket', 'required' => True],
];

// 將參數鍵轉換為 getopt 所需的格式(帶冒號表示需要值)
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的長選項參數
$options = getopt("", $longopts);

// 遍曆參數定義,檢查所有必填項是否已提供
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數中的 region、bucket 和 rule-id
$region = $options["region"];
$bucket = $options["bucket"];
$ruleId = $options["rule-id"];

// 從環境變數中載入訪問憑證(如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入 SDK 預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證提供者、地區和可選的自訂 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構建 GetBucketReplicationProgress 請求對象,用於查詢指定複製規則的同步進度
$request = new Oss\Models\GetBucketReplicationProgressRequest(bucket: $bucket, ruleId: $ruleId);

// 發送請求並擷取複製進度資訊
$result = $client->getBucketReplicationProgress($request);

// 輸出響應的狀態代碼、請求 ID和複製進度詳情
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL .
    'replication progress:' . var_export($result->replicationProgress, true)
);

關閉資料複製

通過刪除儲存空間的複製規則,您可以關閉源儲存空間到目標儲存空間的資料複製關係。

以下代碼用於刪除Bucket中指定規則ID的資料複製關係。

<?php

// 引入 Composer 自動負載檔案,確保 SDK 和依賴類能夠正確載入
require_once __DIR__ . '/../vendor/autoload.php';

// 使用 Alibaba Cloud OSS V2 命名空間,並簡寫為 Oss
use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數及其說明和是否必填
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
    "bucket" => ['help' => 'The name of the bucket', 'required' => True],
    "rule-id" => ['help' => 'The replication rule id of the bucket', 'required' => True],
];

// 將參數鍵轉換為 getopt 所需的格式(帶冒號表示需要值)
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 擷取命令列傳入的長選項參數
$options = getopt("", $longopts);

// 遍曆參數定義,檢查所有必填項是否已提供
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help";
        exit(1);
    }
}

// 提取命令列參數中的 region、bucket 和 rule-id
$region = $options["region"];
$bucket = $options["bucket"];
$ruleId = $options["rule-id"];

// 從環境變數中載入訪問憑證(如 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET)
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 載入 SDK 預設配置
$cfg = Oss\Config::loadDefault();

// 設定憑證提供者、地區以及可選的自訂 Endpoint
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// 建立 OSS 用戶端執行個體
$client = new Oss\Client($cfg);

// 構建 DeleteBucketReplication 請求對象,用於刪除指定複製規則
$request = new Oss\Models\DeleteBucketReplicationRequest(
    bucket: $bucket,
    replicationRules: new Oss\Models\ReplicationRules(
        ids: [$ruleId] // 指定要刪除的複製規則 ID 列表
    )
);

// 發送請求以刪除指定的複製規則
$result = $client->deleteBucketReplication($request);

// 輸出響應的狀態代碼和請求 ID
printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId
);