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-hangzhouda 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:
|
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] );
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
Referência
Para acessar o código de exemplo completo do gerenciador de cópia, consulte o GitHub.