Ao chamar operações de API, recomendamos integrar o SDK ao seu projeto. Os SDKs simplificam o processo de desenvolvimento, integram recursos rapidamente e reduzem significativamente o custo de O&M. Para usar o Alibaba Cloud SDK, execute as seguintes etapas: instale o Alibaba Cloud SDK, configure uma credencial de acesso e use o SDK. Este tópico descreve como usar o Alibaba Cloud SDK.
Pré-requisitos
PHP 5.6 ou superior instalado.
Composer instalado.
A versão do PHP usada para instalar o Alibaba Cloud SDK V2.0 com o Composer deve ser anterior ou igual à versão do PHP usada para executar o Alibaba Cloud SDK V2.0. 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 superior. Se a pasta vendor for copiada para o PHP 5.6, a dependência será incompatível com o PHP 5.6. Se você não conseguir instalar o Composer devido a problemas de rede, execute o seguinte comando para usar a imagem completa do Composer fornecida pela Alibaba Cloud:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
Importe o SDK.
Acesse o Centro de SDK e selecione o service cujo SDK você deseja usar. 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).

Configure uma credencial de acesso
Para chamar operações de API de um Alibaba Cloud service, você deve configurar uma credencial de acesso, como um AccessKey pair ou um Security Token Service (STS) token. Para evitar vazamentos de AccessKey pair, você pode registrar o AccessKey pair em variáveis de ambiente. Para mais informações sobre outras soluções de segurança, consulte Credential security solutions. Neste exemplo, as variáveis de ambiente ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET são usadas para registrar AccessKey pairs.
Método de configuração no Linux e macOS
Os exemplos a seguir usam ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET como nomes de variáveis. Substitua-os pelos seus próprios nomes, se necessário, como OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET.
Execute os seguintes comandos export para definir as variáveis de ambiente:
As variáveis definidas com export são temporárias e válidas apenas para a sessão atual. Para persistência, adicione o comando export ao seu arquivo de inicialização do shell (como ~/.bashrc ou ~/.zshrc).
-
Defina o AccessKey ID:
# Replace yourAccessKeyID with your AccessKey ID. export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID -
Defina o AccessKey secret:
# Replace yourAccessKeySecret with your AccessKey secret. export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret -
Verifique a configuração.
Execute
echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Se o valor correto for retornado, a configuração foi bem-sucedida.
Método de configuração no Windows
Use 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 sua á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
-
Teste a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Execute, 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 comandos retornarem o AccessKey correto, a configuração foi bem-sucedida.
Use 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 do usuário. -
Teste a configuração
Clique em Start (ou use o atalho de teclado Win+R), clique em Execute, 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 comandos retornarem o AccessKey correto, a configuração foi bem-sucedida.
Use o Windows PowerShell
No PowerShell, você pode definir 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, você deve ter 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)
Você pode definir variáveis de ambiente temporárias que são 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 comandos retornarem o AccessKey correto, a configuração foi bem-sucedida.
Use o SDK
Neste exemplo, a operação de API SendMessageToGlobe do Short Message Service (SMS) é chamada. Para mais informações sobre SendMessageToGlobe, consulte SendMessageToGlobe.
1. Inicialize um client de requisição
No SDK, todas as requisições para operações de API são enviadas de um client. Antes de chamar uma operação de API, você deve inicializar o client de requisição. Você pode usar vários métodos para inicializar um client de requisição. Neste exemplo, um AccessKey pair é usado para inicializar um client de requisição. Para mais informações, consulte Gerencie 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. Você não precisa criar uma instância para cada thread.
Em projetos de desenvolvimento, recomendamos não usar a palavra-chave new para criar objetos client com frequência. Caso contrário, o desperdício de recursos pode aumentar e a performance do service pode degradar. Recomendamos encapsular o client no modo 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. Crie um objeto de requisição
Ao chamar uma operação de API para passar parâmetros, você deve usar o objeto de requisição fornecido pelo SDK. Nomeie o objeto de requisição da operação de API no seguinte formato: <API operation name>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 mais informações sobre os parâmetros da operação SendMessageToGlobe, consulte SendMessageToGlobe.
Se a operação de API não suportar parâmetros de requisição, você não precisa criar um objeto de requisição. Por exemplo, a operação DescribeCdnSubList não suporta 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. Inicie uma requisição de API
Ao usar um client de requisição para chamar uma operação de API, recomendamos nomear a função no seguinte formato: <API operation name>WithOptions. Especifique <API operation name> em camel case. Esta 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 é usado para especificar a ação da requisição, como configurações de timeout e proxy. Para mais informações, consulte Advanced configuration.
Se a operação de API não suportar parâmetros de requisição, você não precisa especificar um objeto de requisição na requisição. Por exemplo, você só precisa especificar o parâmetro de runtime ao chamar a operação DescribeCdnSubList.
// Create runtime parameters.
$runtime = new RuntimeOptions([]);
$client = self::createClient();
// Send a request.
$client->sendMessageToGlobeWithOptions($sendMessageToGlobeRequest, $runtime);
4. Trate erros
O Alibaba Cloud SDK V2.0 para PHP classifica as exceções nos seguintes tipos:
TeaUnretryableException: Na maioria dos casos, esse tipo de exceção é causado por problemas de rede e é reportado quando o número máximo de tentativas é atingido.
InvalidArgumentException: Na maioria dos casos, esse tipo de erro é acionado quando um parâmetro obrigatório não é especificado ou o tipo do parâmetro é inválido. Você pode verificar o
messagedo erro para localizar o erro.TeaException: Na maioria dos casos, esse tipo de exceção é causado por erros de negócio.
Para mais informações sobre como tratar exceções do SDK, consulte Exception handling.
Recomendamos que você tome medidas adequadas de tratamento de exceções, como reportar exceções, registrar logs de exceções e executar tentativas, para garantir a robustez e a estabilidade do seu sistema.
Visualize o código de exemplo completo
Cenário especial: Upload de arquivo através da operação Advance
Ao usar o Image Search ou o Visual Intelligence API (VIAPI) para processar imagens em uma máquina local ou fazer upload de imagens, a API do Image Search ou VIAPI descrita na documentação não suporta upload direto. Para fazer upload de imagens, você precisa usar a operação Advance, que suporta a transmissão de fluxos de arquivos. O cloud service 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.
-
Inicialize um client de requisição
Certifique-se de que tanto o parâmetro
regionIdquanto oendpointdo cloud service estejam especificados. OregionIdindica a região do OSS onde os arquivos temporários são armazenados. Se você não configurar o parâmetroregionId, o cloud service poderá usar uma região diferente 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); } -
Crie um objeto de requisição
Crie o objeto de requisição <API operation>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 ]); -
Inicie uma requisição
Chame a operação <API operation>AdvanceRequest.
// Configure the runtime parameters. $runtime = new RuntimeOptions([]); $client = self::createClient(); // Send the request. $client->detectBodyCountAdvance($detectBodyCountAdvanceRequest, $runtime);
FAQ
-
Como trato o erro "You are not authorized to perform this operation" lançado por uma operação de API?
Causas possíveis: O AccessKey pair do usuário do Resource Access Management (RAM) não tem as permissões para chamar a operação de API.
Soluções: Conceda as permissões necessárias ao usuário do RAM. Para mais informações, consulte Gerencie permissões de usuário do RAM.
Por exemplo, se o erro "You are not authorized to perform this operation" for lançado pela operação de API SendMessageToGlobe, crie a seguinte política personalizada para conceder as permissões necessárias ao usuário do RAM:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "dysms:SendMessageToGlobe", "Resource": "*" } ] } -
Como trato o erro de endpoint "PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException" cuja mensagem de erro é cURL error 3?
Causas possíveis: A operação de API não suporta o endpoint que você especifica ao inicializar o client de requisição.
Soluções: Especifique um endpoint suportado e tente novamente. Para mais informações, consulte Configure um endpoint.
-
Como trato o erro de AccessKey "PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function AlibabaCloud\Credentials\AccessKeyCredential::__construct(), 1 passed and exactly 2" lançado por uma operação de API?
Causas possíveis: O AccessKey pair não é passado corretamente para a requisição.
Soluções: Certifique-se de que o AccessKey pair seja passado corretamente ao inicializar o client de requisição. O valor
XXXdegetenv("XXX")é obtido da variável de ambiente. -
Como trato o erro "code: 414 URL Too Long" lançado pelo Alibaba Cloud SDK?
Causas possíveis: Este problema não é causado pelo método de requisição. Ao usar o Alibaba Cloud SDK, os parâmetros de requisição são passados em URLs. Se uma URL contiver um número excessivo de parâmetros ou valores de parâmetros muito longos, a URL pode exceder o comprimento máximo e causar falhas na requisição.
Soluções: Para evitar URLs muito longas, recomendamos que você use request syntax and signature method V3. Use assinaturas autoassinadas para passar parâmetros no corpo da requisição e defina o tipo do corpo como
Content-Type: application/x-www-form-urlencoded.
Para mais informações sobre como tratar erros do SDK, consulte FAQ.