Todos os produtos
Search
Central de documentação

Object Storage Service:Copiar objetos com o OSS SDK for PHP 2.0

Última atualização: Sep 24, 2026

Este tópico descreve como usar o novo módulo Copier no OSS SDK for PHP 2.0 para copiar arquivos.

Observações de uso

  • O código de exemplo neste tópico usa o ID de região cn-hangzhou da região China (Hangzhou). Por padrão, o acesso a recursos em um bucket utiliza um endpoint público. Para acessar recursos no bucket a partir de outros serviços da Alibaba Cloud na mesma região do bucket, use um endpoint interno. Para mais informações sobre as regiões e endpoints compatíveis com o OSS, consulte Regions and endpoints.

  • Para copiar um objeto, é necessário ter permissão de leitura no objeto de origem e permissões de leitura e gravação no bucket de destino.

  • O bucket de origem e o bucket de destino devem estar na mesma região. Por exemplo, não é possível copiar objetos de um bucket na região China (Hangzhou) para um bucket na região China (Qingdao).

  • Certifique-se de que nenhuma política de retenção esteja configurada para o bucket de origem e o bucket de destino. Caso contrário, o sistema exibirá a seguinte mensagem de erro: The object you specified is immutable.

  • Neste tópico, o código utiliza variáveis de ambiente para obter as credenciais de acesso. Para mais informações sobre como configurar credenciais de acesso para o OSS SDK for PHP 2.0, consulte Configure access credentials for PHP.

Método

Copier

Para copiar um objeto de um bucket para outro ou modificar os atributos de um objeto, chame a operação CopyObject ou a operação UploadPartCopy. Essas operações atendem a cenários diferentes:

  • A API de cópia (CopyObject) copia apenas objetos menores que 5 GiB.

  • A operação (UploadPartCopy) copia objetos com tamanho igual ou superior a 5 GiB. No entanto, essa operação não é compatível com as diretivas (x-oss-metadata-directive) e (x-oss-tagging-directive). Para configurar metadados e tags durante uma operação de cópia de múltiplas partes, você deve implementar uma lógica adicional.

O novo gerenciador de cópia, Copier, introduzido no OSS SDK for PHP 2.0, oferece uma interface unificada e de alto nível para copiar objetos. Ele seleciona automaticamente a API de cópia ideal com base nos parâmetros da solicitação, ocultando detalhes de implementação e diferenças de interface. A definição dos métodos comuns do Copier é a seguinte:

final class Copier
{
    ...
    public function __construct($client, array $args = [])

    public function copy(Models\CopyObjectRequest $request, array $args = []): Models\CopyResult
}

Parâmetros da solicitação

Parâmetro

Tipo

Descrição

request

CopyObjectRequest

Parâmetros da solicitação para copiar um objeto. São os mesmos parâmetros da API CopyObject.

args

array

(Opcional) Opções de configuração.

Parâmetros comuns de CopyObjectRequest

Parâmetro

Tipo

Descrição

bucket

string

O nome do bucket de destino.

key

string

O nome do objeto de destino.

sourceBucket

string

O nome do bucket de origem.

sourceKey

string

O nome do objeto de origem.

forbidOverwrite

string

Define se a operação CopyObject substitui um objeto com o mesmo nome no bucket de destino.

tagging

string

As tags do objeto. Permite especificar várias tags simultaneamente, como TagA=A&TagB=B.

taggingDirective

string

Define como configurar as tags do objeto de destino. Valores válidos:

  • Copy (padrão): Copia as tags do objeto de origem para o objeto de destino.

  • Replace: Ignora as tags do objeto de origem e usa as tags especificadas na solicitação.

Parâmetros comuns de args

Parâmetro

Tipo

Descrição

part_size

int

Tamanho da parte. Valor padrão: 64 MiB.

parallel_num

int

Número de tarefas de upload simultâneas. Valor padrão: 3. Este parâmetro define o limite de simultaneidade para uma única chamada, e não o limite global.

multipart_copy_threshold

int

Limiar para usar a cópia de múltiplas partes. Valor padrão: 200 MiB.

leave_parts_on_error

bool

Define se o sistema mantém as partes copiadas em caso de falha na cópia. Por padrão, as partes não são mantidas.

disable_shallow_copy

bool

Desativa o comportamento de cópia superficial (shallow copy). Por padrão, a cópia superficial está ativada.

Ao instanciar um cliente Copier, especifique as opções de configuração para personalizar o comportamento padrão de cópia de todos os objetos. Você também pode substituir essas configurações para uma cópia individual, passando opções específicas em cada solicitação de cópia.

  • Especifique os parâmetros de configuração para o Copier:

    $c = $client->newCopier(['part_size' => 100 * 1024 * 1024]);
  • Especifique os parâmetros de configuração para cada solicitação de cópia:

    $c->copy(
        new Oss\Models\CopyObjectRequest(
            bucket: 'bucket',
            key: 'key',
            sourceBucket: 'src-bucket',
            sourceKey: 'src-key',
        ),
        args: ['part_size' => 100 * 1024 * 1024]
    );
Nota

Durante a cópia de um objeto, a propriedade metadataDirective em CopyObjectRequest define como os metadados são copiados. Por padrão, o sistema copia os metadados do objeto de origem.

Da mesma forma, a propriedade taggingDirective em CopyObjectRequest define como as tags são copiadas. Por padrão, o sistema copia as tags do objeto de origem.

Neste tópico, o exemplo utiliza variáveis de ambiente para obter as credenciais de acesso. Para mais informações sobre como configurar credenciais de acesso, consulte Product selection.

Código de exemplo

O código a seguir copia um objeto de um bucket de origem para um bucket de destino. Por padrão, o sistema também copia os metadados e as tags do objeto de origem.

<?php

// Import the autoloader file to ensure that dependency libraries can be loaded correctly.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Define the description of command line arguments.
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // The region where the bucket is located. (Required)
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // The endpoint. (Optional)
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // The bucket name. (Required)
    "key" => ['help' => 'The name of the object', 'required' => True], // The name of the destination object. (Required)
    "src-key" => ['help' => 'The name of the source object', 'required' => True], // The name of the source object. (Required)
];

// Convert the parameter descriptions to the long option format required by getopt.
// Add a colon ":" after each parameter to indicate that the parameter requires a value.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parse the command line arguments.
$options = getopt("", $longopts);

// Verify that all required arguments are provided.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Obtain the help information for the parameter.
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // If a required parameter is missing, exit the program.
    }
}

// Extract values from the parsed arguments.
$region = $options["region"]; // The region where the bucket is located.
$bucket = $options["bucket"]; // The bucket name.
$key = $options["key"];       // The name of the destination object.
$srcKey = $options["src-key"]; // The name of the source object.

// Load the credential information from environment variables.
// Use EnvironmentVariableCredentialsProvider to read the AccessKey ID and AccessKey secret from environment variables.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Use the default configurations of the SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Set the credential provider.
$cfg->setRegion($region); // Set the region where the bucket is located.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // If an endpoint is provided, set the endpoint.
}

// Create an OSS client instance.
$client = new Oss\Client($cfg);

// Create a Copier instance to perform copy operations.
$copier = $client->newCopier();

$dstKey = "multipart-copy-replace-empty-metadata-and-tagging-$key"; // The name of the destination object.
$copyRequest = new Oss\Models\CopyObjectRequest(
    bucket: $bucket,
    key: $dstKey,
    sourceBucket: $bucket,
    sourceKey: $srcKey
);
$copyRequest->metadataDirective = 'REPLACE'; // Replace the metadata.
$copyRequest->taggingDirective = 'REPLACE';  // Replace the tags.
$result = $copier->copy(request: $copyRequest);

printf(
    'status code:' . $result->statusCode . PHP_EOL . // The HTTP status code. For example, 200 indicates that the request is successful.
    'request id:' . $result->requestId . PHP_EOL     // The request ID, which is used to debug or track requests.
);

Cenários comuns

Usar o Copier para especificar o tamanho da parte e o número de partes copiadas em paralelo

O exemplo a seguir mostra como especificar o tamanho da parte e o número de partes copiadas em paralelo ao configurar os parâmetros do Copier:

<?php

// Import the autoloader file to ensure that dependency libraries can be loaded correctly.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Define the description of command line arguments.
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // The region where the bucket is located. (Required)
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // The endpoint. (Optional)
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // The bucket name. (Required)
    "key" => ['help' => 'The name of the object', 'required' => True], // The name of the destination object. (Required)
    "src-key" => ['help' => 'The name of the source object', 'required' => True], // The name of the source object. (Required)
];

// Convert the parameter descriptions to the long option format required by getopt.
// Add a colon ":" after each parameter to indicate that the parameter requires a value.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parse the command line arguments.
$options = getopt("", $longopts);

// Verify that all required arguments are provided.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Obtain the help information for the parameter.
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // If a required parameter is missing, exit the program.
    }
}

// Extract values from the parsed arguments.
$region = $options["region"]; // The region where the bucket is located.
$bucket = $options["bucket"]; // The bucket name.
$key = $options["key"];       // The name of the destination object.
$srcKey = $options["src-key"]; // The name of the source object.

// Load the credential information from environment variables.
// Use EnvironmentVariableCredentialsProvider to read the AccessKey ID and AccessKey secret from environment variables.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Use the default configurations of the SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Set the credential provider.
$cfg->setRegion($region); // Set the region where the bucket is located.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // If an endpoint is provided, set the endpoint.
}

// Create an OSS client instance.
$client = new Oss\Client($cfg);

// Create a Copier instance to perform copy operations.
$copier = $client->newCopier();

// Case 1: Multipart copy with empty metadata and tags.
$dstKey = "multipart-copy-replace-empty-metadata-and-tagging-$key"; // The name of the destination object.
$copyRequest = new Oss\Models\CopyObjectRequest(
    bucket: $bucket,
    key: $dstKey,
    sourceBucket: $bucket,
    sourceKey: $srcKey
);
$copyRequest->metadataDirective = 'REPLACE'; // Replace the metadata.
$copyRequest->taggingDirective = 'REPLACE';  // Replace the tags.
$result = $copier->copy(
    request: $copyRequest,
    args: [
        'part_size' => 1 * 1024 * 1024, // Specify the part size as 1 MB.
        'parallel_num' => 5    // Specify the concurrency for the copy task as 5.
    ]
);
printf(
    'status code:' . $result->statusCode . PHP_EOL . // The HTTP status code. For example, 200 indicates that the request is successful.
    'request id:' . $result->requestId . PHP_EOL     // The request ID, which is used to debug or track requests.
);

Referência

  • Para acessar o código de exemplo completo do gerenciador de cópia, consulte o GitHub.