Ao chamar operações de API, recomendamos integrar o SDK ao seu projeto. Os SDKs simplificam o desenvolvimento, integram recursos rapidamente e reduzem significativamente os custos de O&M. Para usar o Alibaba Cloud SDK, execute as seguintes etapas: instale o SDK, configure uma credencial de acesso e utilize-o. Este tópico descreve como usar o Alibaba Cloud SDK.
Pré-requisitos
PHP 5.6 ou posterior instalado.
Composer instalado.
A versão do PHP usada para instalar o Alibaba Cloud SDK V2.0 via Composer deve ser igual ou anterior à versão usada para executá-lo. Por exemplo, a pasta vendor gerada após a instalação do Alibaba Cloud SDK V2.0 no PHP 7.2 só pode ser usada no PHP 7.2 ou posterior. Se você copiar a pasta vendor para o PHP 5.6, a dependência será incompatível com essa versão. Caso não consiga instalar o Composer devido a problemas de rede, execute o comando abaixo para usar a imagem completa do Composer fornecida pela Alibaba Cloud:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
Importar o SDK
Faça login no SDK Center e selecione o serviço cujo SDK deseja utilizar. Neste exemplo, o Short Message Service (SMS) está selecionado.
-
Na página Install, selecione V2.0 na lista suspensa SDK Generation e clique em PHP na seção All languages. Na aba Quick Start, obtenha o método de instalação do SDK do Short Message Service (SMS).

Configurar uma credencial de acesso
Para chamar operações de API de um serviço da Alibaba Cloud, configure uma credencial de acesso, como um AccessKey pair ou um Security Token Service (STS) token. Para evitar vazamentos do par de AccessKey, armazene-o em variáveis de ambiente. Para mais informações sobre outras soluções de segurança, consulte Soluções de segurança de credenciais. Neste exemplo, as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET armazenam os pares de AccessKey.
Método de configuração no Linux e macOS
Configurar variáveis de ambiente usando o comando export
Uma variável de ambiente temporária definida com o comando export é válida apenas para a sessão atual. A variável é limpa quando a sessão termina. Para retenção de longo prazo (LTR), adicione o comando export ao arquivo de configuração de inicialização do seu sistema operacional.
-
Configure o AccessKey ID e pressione Enter.
# Replace yourAccessKeyID with your AccessKey ID. export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID -
Configure o AccessKey secret e pressione Enter.
# Replace yourAccessKeySecret with your AccessKey secret. export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret -
Verifique a configuração.
Execute o comando
echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Se o retorno for o AccessKey ID correto, a configuração foi bem-sucedida.
Método de configuração no Windows
Usar a interface gráfica do usuário (GUI)
-
Procedimento
As etapas a seguir descrevem como definir variáveis de ambiente usando a GUI no Windows 10.
Na área de trabalho, clique com o botão direito em This PC e escolha Properties > Advanced system settings > Environment Variables > New em System variables ou User variables. Em seguida, conclua a configuração.
Variável
Valor de exemplo
AccessKey ID
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_ID
Valor da variável: yourAccessKeyID
AccessKey Secret
Nome da variável: ALIBABA_CLOUD_ACCESS_KEY_SECRET
Valor da variável: yourAccessKeySecret
-
Testar a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Run, insira
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os retornos forem os valores corretos de AccessKey, a configuração foi bem-sucedida.
Usar o prompt de comando (CMD)
-
Procedimento
Abra o prompt de comando como administrador e execute os seguintes comandos para adicionar novas variáveis de ambiente ao sistema.
setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /MO parâmetro
/Mindica uma variável de ambiente do sistema. Você pode omitir esse parâmetro ao definir uma variável de ambiente de usuário. -
Testar a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Run, insira
cmde clique em OK (ou pressione Enter) para abrir o prompt de comando. Execute os comandosecho %ALIBABA_CLOUD_ACCESS_KEY_ID%eecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Se os retornos forem os valores corretos de AccessKey, a configuração foi bem-sucedida.
Usar o Windows PowerShell
No PowerShell, defina novas variáveis de ambiente válidas para todas as novas sessões:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)
Para definir variáveis de ambiente para todos os usuários, são necessárias permissões administrativas:
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)
Defina variáveis de ambiente temporárias válidas apenas para a sessão atual:
$env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
$env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"
No PowerShell, execute os comandos Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID e Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Se os retornos forem os valores corretos de AccessKey, a configuração foi bem-sucedida.
Usar o SDK
Neste exemplo, chamamos a operação de API SendMessageToGlobe do Short Message Service (SMS). Para mais informações sobre SendMessageToGlobe, consulte SendMessageToGlobe.
1. Inicializar um cliente de requisição
No SDK, todas as requisições para operações de API partem de um cliente. Antes de chamar uma operação de API, inicialize o cliente de requisição. Existem vários métodos para essa inicialização. Neste exemplo, usamos um par de AccessKey. Para mais informações, consulte Gerenciar credenciais de acesso.
Objetos Client, como instâncias Dysmsapi, são thread-safe e podem ser usados em ambientes multithread sem riscos de segurança. Não é necessário criar uma instância para cada thread.
Em projetos de desenvolvimento, evite usar a palavra-chave new para criar objetos Client frequentemente. Caso contrário, o desperdício de recursos pode aumentar e o desempenho do serviço pode degradar. Recomendamos encapsular o cliente no padrão singleton. Isso garante que apenas uma instância Client seja inicializada para a mesma credencial de acesso e endpoint durante todo o ciclo de vida da aplicação.
public static function createClient(){
$config = new Config([
// Required, please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID is set.
"accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// Required, please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
"accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
]);
$config->endpoint = "dysmsapi.aliyuncs.com";
return new Dysmsapi($config);
}
2. Criar um objeto de requisição
Ao chamar uma operação de API para passar parâmetros, utilize o objeto de requisição fornecido pelo SDK. Nomeie o objeto de requisição da operação de API no seguinte formato: <Nome da operação de API>Request. Por exemplo, o objeto de requisição da operação de API SendSms é SendSmsRequest. Para mais informações sobre os parâmetros, consulte a referência da API. Para detalhes sobre os parâmetros da operação SendMessageToGlobe, visualize SendMessageToGlobe.
Se a operação de API não suportar parâmetros de requisição, não será necessário criar um objeto de requisição. Por exemplo, a operação DescribeCdnSubList não aceita parâmetros de requisição.
// Create request object and set required input parameters
$sendMessageToGlobeRequest = new SendMessageToGlobeRequest([
// Please replace with the actual recipient number.
"to" => "<YOUR_VALUE>",
// Please replace with the actual SMS content.
"message" => "<YOUR_VALUE>"
]);
3. Iniciar uma requisição de API
Ao usar um cliente de requisição para chamar uma operação de API, recomendamos nomear a função no seguinte formato: <Nome da operação de API>WithOptions. Especifique <API operation name> em camel case. Essa função contém dois parâmetros: o objeto de requisição e o parâmetro de runtime. O objeto de requisição é criado na etapa anterior. O parâmetro de runtime serve para especificar ações da requisição, como configurações de timeout e proxy. Para mais informações, consulte Configuração avançada.
Se a operação de API não suportar parâmetros de requisição, não especifique um objeto de requisição na chamada. Por exemplo, ao chamar a operação DescribeCdnSubList, especifique apenas o parâmetro de runtime.
// Create runtime parameters.
$runtime = new RuntimeOptions([]);
$client = self::createClient();
// Send a request.
$client->sendMessageToGlobeWithOptions($sendMessageToGlobeRequest, $runtime);
4. Tratar erros
O Alibaba Cloud SDK V2.0 para PHP classifica as exceções nos seguintes tipos:
TeaUnretryableException: Geralmente causada por problemas de rede e reportada quando o número máximo de tentativas é atingido.
InvalidArgumentException: Normalmente ocorre quando um parâmetro obrigatório não é especificado ou o tipo do parâmetro é inválido. Verifique a
messagede erro para localizar a falha.TeaException: Na maioria dos casos, resulta de erros de negócio.
Para mais informações sobre como lidar com exceções do SDK, consulte Tratamento de exceções.
Recomendamos adotar medidas adequadas de tratamento de exceções, como relatar erros, registrar logs e realizar novas tentativas, para garantir a robustez e estabilidade do seu sistema.
Clique para visualizar o código de exemplo completo
Cenário especial: Upload de arquivo através da operação Advance
Ao usar Image Search ou Visual Intelligence API (VIAPI) para processar imagens em uma máquina local ou fazer upload de imagens, note que a API descrita na documentação não suporta upload direto. Para enviar imagens, utilize a operação Advance, que suporta transmissão de fluxos de arquivos. O serviço em nuvem armazena temporariamente o arquivo enviado no Object Storage Service (OSS) e lê o arquivo temporário do OSS quando necessário. A região padrão do OSS é cn-shanghai. O exemplo a seguir mostra como chamar a operação DetectBodyCount do VIAPI:
Arquivos temporários no OSS são limpos regularmente.
-
Inicializar um cliente de requisição
Certifique-se de especificar tanto o parâmetro
regionIdquanto oendpointdo serviço em nuvem. OregionIdindica a região do OSS onde os arquivos temporários são armazenados. Se você não configurar o parâmetroregionId, o serviço em nuvem poderá usar uma região diferente da do OSS, resultando em timeouts de API.function createClient() { $config = new Config([ // getenv specifies that the access credential is obtained from environment variables. // Required. Make sure that the following environment variable is set in the code runtime environment: ALIBABA_CLOUD_ACCESS_KEY_ID. "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), // Required. Make sure that the following environment variable is set in the code runtime environment: ALIBABA_CLOUD_ACCESS_KEY_SECRET. "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") ]); // Specify the same region for the endpoint and regionId parameters. $config->endpoint = "facebody.cn-shanghai.aliyuncs.com"; $config->regionId = "cn-shanghai"; return new Facebody($config); } -
Criar um objeto de requisição
Crie o objeto de requisição <Operação de API>AdvanceRequest para passar fluxos de arquivos. No objeto de requisição, defina o nome do parâmetro como
ImageURLObject.// Read the file and convert it to a Stream object. $imagePath = "<FILE_PATH>"; // Replace <FILE_PATH> with the actual file path. try { $fileStream = new Stream(fopen($imagePath, "r")); } catch (\Exception $e) { die("Failed to read the file: " . $e->getMessage()); } // Create a request object and configure the request parameters. $detectBodyCountAdvanceRequest = new DetectBodyCountAdvanceRequest([ "imageURLObject" => $fileStream ]); -
Iniciar uma requisição
Chame a operação <Operação de API>AdvanceRequest.
// Configure the runtime parameters. $runtime = new RuntimeOptions([]); $client = self::createClient(); // Send the request. $client->detectBodyCountAdvance($detectBodyCountAdvanceRequest, $runtime);
Perguntas frequentes
-
Como tratar o erro "You are not authorized to perform this operation" retornado por uma operação de API?
Causas possíveis: O par de AccessKey do usuário do Resource Access Management (RAM) não possui permissões para chamar a operação de API.
Soluções: Conceda as permissões necessárias ao usuário RAM. Para mais informações, consulte Gerenciar permissões de usuário RAM.
Por exemplo, se a operação de API SendMessageToGlobe retornar o erro "You are not authorized to perform this operation", crie a seguinte política personalizada para conceder as permissões necessárias ao usuário RAM:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "dysms:SendMessageToGlobe", "Resource": "*" } ] } -
Como resolver o erro de endpoint "PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException" com a mensagem de erro cURL error 3?
Causas possíveis: A operação de API não suporta o endpoint especificado durante a inicialização do cliente de requisição.
Soluções: Especifique um endpoint suportado e tente novamente. Para mais informações, consulte Configurar um endpoint.
-
Como lidar com o erro de AccessKey "PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function AlibabaCloud\Credentials\AccessKeyCredential::__construct(), 1 passed and exactly 2" retornado por uma operação de API?
Causas possíveis: O par de AccessKey não foi passado corretamente para a requisição.
Soluções: Certifique-se de passar o par de AccessKey corretamente ao inicializar o cliente de requisição. O valor
XXXemgetenv("XXX")é obtido da variável de ambiente. -
Como corrigir o erro "code: 414 URL Too Long" retornado pelo Alibaba Cloud SDK?
Causas possíveis: Esse problema não decorre do método de requisição. Ao usar o Alibaba Cloud SDK, os parâmetros de requisição são passados nas URLs. Se uma URL contiver muitos parâmetros ou valores excessivamente longos, ela pode exceder o comprimento máximo e causar falhas na requisição.
Soluções: Para evitar URLs excessivamente longas, recomendamos usar a sintaxe de requisição e método de assinatura V3. Utilize assinaturas autoassinadas para passar parâmetros no corpo da requisição e defina o tipo de corpo como
Content-Type: application/x-www-form-urlencoded.
Para mais informações sobre como tratar erros do SDK, consulte Perguntas frequentes.