API オペレーションを呼び出す場合は、SDK をプロジェクトに統合することをお勧めします。 SDK は開発プロセスを簡素化し、機能を迅速に統合し、O&M コストを大幅に削減します。 Alibaba Cloud SDK を使用するには、Alibaba Cloud SDK のインストール、アクセス認証情報の構成、SDK の使用という手順を実行します。 このトピックでは、Alibaba Cloud SDK の使用方法について説明します。
前提条件
PHP 5.6 以後がインストールされている。
Composer がインストールされている。
Composer を使用して Alibaba Cloud SDK V2.0 をインストールするために使用する PHP のバージョンは、Alibaba Cloud SDK V2.0 を実行するために使用する PHP のバージョン以下である必要があります。 たとえば、PHP 7.2 に Alibaba Cloud SDK V2.0 をインストールした後に生成される vendor フォルダは、PHP 7.2 以後でしか使用できません。 vendor フォルダを PHP 5.6 にコピーすると、依存関係が PHP 5.6 と互換性がなくなります。 ネットワークの問題で Composer をインストールできない場合は、次のコマンドを実行して、Alibaba Cloud が提供する Composer のフルイメージを使用できます。
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/SDK をインポートする
SDK Center にログインし、SDK を使用するサービスを選択します。 この例では、Short Message Service (SMS) を選択します。
[インストール] ページで、[SDK の生成] ドロップダウンリストから [V2.0] を選択し、[すべての言語] セクションで [PHP] をクリックします。 [クイックスタート] タブで、Short Message Service (SMS) SDK のインストール方法を取得します。

アクセス認証情報を構成する
Alibaba Cloud サービスの API オペレーションを呼び出すには、AccessKey ペア や Security Token Service (STS) トークン などのアクセス認証情報を構成する必要があります。 AccessKey ペアの漏洩を防ぐために、環境変数に AccessKey ペアを記録できます。 その他のセキュリティソリューションの詳細については、「認証情報のセキュリティソリューション」をご参照ください。 この例では、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を使用して、AccessKey ペアを記録します。
Linux および macOS で環境変数を構成する
export コマンドを使用して環境変数を構成する
export コマンドを使用して構成された一時環境変数は、現在のセッションでのみ有効です。 セッションを終了すると、構成された環境変数は無効になります。 永続的な環境変数を構成するには、対応するオペレーティングシステムの起動構成ファイルに export コマンドを追加します。
AccessKey ID を構成し、Enter キーを押します。
# <ACCESS_KEY_ID> を AccessKey ID に置き換えます。 export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyIDAccessKey シークレットを構成し、Enter キーを押します。
# <ACCESS_KEY_SECRET> を AccessKey シークレットに置き換えます。 export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret構成が成功したかどうかを確認します。
echo $ALIBABA_CLOUD_ACCESS_KEY_IDコマンドを実行します。 有効な AccessKey ID が返された場合、環境変数は構成されています。
Windows で環境変数を構成する
GUI を使用する
手順
Windows 10 で GUI を使用して環境変数を構成する場合は、次の手順を実行します。
Windows デスクトップで、[この PC] を右クリックし、[プロパティ] を選択します。 表示されたページで、[システムの詳細設定] をクリックします。 [システムのプロパティ] ダイアログボックスの [詳細設定] タブで、[環境変数] をクリックします。 [環境変数] ダイアログボックスで、[ユーザー環境変数] または [システム環境変数] セクションの [新規] をクリックします。 次に、次の表に示す変数を構成します。
変数
例
AccessKey ID
変数名: ALIBABA_CLOUD_ACCESS_KEY_ID
変数値: LTAI****************
AccessKey シークレット
変数名: ALIBABA_CLOUD_ACCESS_KEY_SECRET
変数値: yourAccessKeySecret
構成が成功したかどうかを確認します。
Windows デスクトップで、[スタート] をクリックするか、[Win + R] キーを押します。 [ファイル名を指定して実行] ダイアログボックスに「cmd」と入力します。 次に、[OK] をクリックするか、Enter キーを押します。 表示されたページで、
echo %ALIBABA_CLOUD_ACCESS_KEY_ID%およびecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%コマンドを実行します。 有効な AccessKey ペアが返された場合、構成は成功です。
CMD を使用する
手順
管理者としてコマンドプロンプトウィンドウを開き、次のコマンドを実行して、オペレーティングシステムに環境変数を追加します。
setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /M/Mは、環境変数がシステムレベルであることを示します。 ユーザーレベルの環境変数を構成する場合は、このパラメータを使用しないことを選択できます。構成が成功したかどうかを確認します。
Windows デスクトップで、[スタート] をクリックするか、[Win + R] キーを押します。 [ファイル名を指定して実行] ダイアログボックスに「cmd」と入力します。 次に、[OK] をクリックするか、Enter キーを押します。 表示されたページで、
echo %ALIBABA_CLOUD_ACCESS_KEY_ID%およびecho %ALIBABA_CLOUD_ACCESS_KEY_SECRET%コマンドを実行します。 有効な AccessKey ペアが返された場合、構成は成功です。
Windows PowerShell を使用する
PowerShell で、新しい環境変数を構成します。 環境変数は、すべての新しいセッションに適用されます。
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)すべてのユーザーの環境変数を構成します。 管理者として次のコマンドを実行する必要があります。
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)一時環境変数を構成します。 環境変数は、現在のセッションにのみ適用されます。
$env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
$env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"PowerShell で、Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID および Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET コマンドを実行します。 有効な AccessKey ペアが返された場合、構成は成功です。
SDK を使用する
この例では、Short Message Service (SMS) の SendMessageToGlobe API オペレーションが呼び出されます。 SendMessageToGlobe の詳細については、「SendMessageToGlobe」をご参照ください。
1. リクエストクライアントを初期化する
SDK では、API オペレーションへのすべてのリクエストはクライアントから送信されます。 API オペレーションを実行する前に、リクエストクライアントを初期化する必要があります。 複数のメソッドを使用して、リクエストクライアントを初期化できます。 この例では、AccessKey ペアを使用してリクエストクライアントを初期化します。 詳細については、「アクセス認証情報を管理する」をご参照ください。
Dysmsapi インスタンスなどのクライアントオブジェクトはスレッドセーフであり、セキュリティリスクなしにマルチスレッド環境で使用できます。 スレッドごとにインスタンスを作成する必要はありません。
開発プロジェクトでは、new キーワードを使用してクライアントオブジェクトを頻繁に作成しないことをお勧めします。 そうしないと、リソースの浪費が増加し、サービスのパフォーマンスが低下する可能性があります。 クライアントをシングルトンモードでカプセル化することをお勧めします。 これにより、アプリケーションのライフサイクル全体で、同じアクセス認証情報とエンドポイントに対して 1 つのクライアントインスタンスのみが初期化されます。
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. リクエストオブジェクトを作成する
API オペレーションを呼び出してパラメータを渡すときは、SDK が提供するリクエストオブジェクトを使用する必要があります。 API オペレーションのリクエストオブジェクトには、<API オペレーション名>Request という形式で名前を付けます。 たとえば、SendSms API オペレーションのリクエストオブジェクトは SendSmsRequest です。 パラメータの詳細については、API リファレンスを参照してください。 SendMessageToGlobe オペレーションのパラメータの詳細については、「SendMessageToGlobe」をご参照ください。
API オペレーションがリクエストパラメータをサポートしていない場合は、リクエストオブジェクトを作成する必要はありません。 たとえば、DescribeCdnSubList オペレーションはリクエストパラメータをサポートしていません。
// 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. API リクエストを開始する
リクエストクライアントを使用して API オペレーションを呼び出すときは、関数に <API オペレーション名>WithOptions という形式で名前を付けることをお勧めします。 <API オペレーション名> はキャメルケースで指定します。 この関数には、リクエストオブジェクトとランタイムパラメータという 2 つのパラメータが含まれています。 リクエストオブジェクトは前の手順で作成されます。 ランタイムパラメータは、タイムアウトやプロキシ構成などのリクエストアクションを指定するために使用されます。 詳細については、「詳細構成」をご参照ください。
API オペレーションがリクエストパラメータをサポートしていない場合は、リクエストにリクエストオブジェクトを指定する必要はありません。 たとえば、DescribeCdnSubList オペレーションを呼び出すときは、ランタイムパラメータのみを指定する必要があります。
// Create runtime parameters.
$runtime = new RuntimeOptions([]);
$client = self::createClient();
// Send a request.
$client->sendMessageToGlobeWithOptions($sendMessageToGlobeRequest, $runtime);4. エラーを処理する
Alibaba Cloud SDK V2.0 for PHP は、例外を次のタイプに分類します。
TeaUnretryableException: ほとんどの場合、このタイプの例外はネットワークの問題が原因で発生し、最大再試行回数に達したときに報告されます。
InvalidArgumentException: ほとんどの場合、このタイプのエラーは、必須パラメータが指定されていないか、パラメータタイプが無効な場合に発生します。 エラー
messageを確認して、エラーを特定できます。TeaException: ほとんどの場合、このタイプの例外はビジネスエラーが原因で発生します。
SDK 例外の処理方法の詳細については、「例外処理」をご参照ください。
システムの堅牢性と安定性を確保するために、例外の報告、例外のログ記録、再試行の実行など、適切な例外処理対策を講じることをお勧めします。
クリックして完全なサンプルコードを表示する
特別なシナリオ: Advance オペレーションによるファイルアップロード
オンプレミス機器の画像を処理したり、画像をアップロードしたりするために画像検索または Visual Intelligence API (VIAPI) を使用する場合、ドキュメントに記載されている画像検索または VIAPI の API は直接アップロードをサポートしていません。 画像をアップロードするには、ファイルストリームの送信をサポートする Advance オペレーションを使用する必要があります。 クラウドサービスは、アップロードされたファイルを一時的に Object Storage Service (OSS) に保存し、必要なときに OSS から一時ファイルを読み取ります。 OSS のデフォルトリージョンは cn-shanghai です。 次の例は、VIAPI の DetectBodyCount オペレーションを呼び出す方法を示しています。
OSS の一時ファイルは定期的にクリアされます。
リクエストクライアントを初期化する
regionIdパラメータとクラウドサービスのendpointの両方が指定されていることを確認します。regionIdは、一時ファイルが保存される OSS リージョンを示します。regionIdパラメータを構成しないと、クラウドサービスが OSS とは異なるリージョンを使用する可能性があり、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); }リクエストオブジェクトを作成する
ファイルストリームを渡すために、
<API オペレーション>AdvanceRequestリクエストオブジェクトを作成します。 リクエストオブジェクトで、パラメータ名を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 ]);リクエストを開始する
<API オペレーション>AdvanceRequestオペレーションを呼び出します。// Configure the runtime parameters. $runtime = new RuntimeOptions([]); $client = self::createClient(); // Send the request. $client->detectBodyCountAdvance($detectBodyCountAdvanceRequest, $runtime);
よくある質問
API オペレーションによってスローされた「このオペレーションを実行する権限がありません」エラーを処理するにはどうすればよいですか?
考えられる原因: Resource Access Management (RAM) ユーザーの AccessKey ペアに、API オペレーションを呼び出す権限がありません。
解決策: 必要な権限を RAM ユーザーに付与します。 詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
たとえば、SendMessageToGlobe API オペレーションによって「このオペレーションを実行する権限がありません」エラーがスローされた場合は、次のカスタムポリシーを作成して、必要な権限を RAM ユーザーに付与します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "dysms:SendMessageToGlobe", "Resource": "*" } ] }エラーメッセージが cURL エラー 3 である「PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException" endpoint エラーを処理するにはどうすればよいですか?
考えられる原因: リクエストクライアントを初期化するときに指定したエンドポイントは、API オペレーションでサポートされていません。
解決策: サポートされているエンドポイントを指定して、再試行します。 詳細については、「エンドポイントを構成する」をご参照ください。
API オペレーションによってスローされた「PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function AlibabaCloud\Credentials\AccessKeyCredential::__construct(), 1 passed and exactly 2" AccessKey エラーを処理するにはどうすればよいですか?
考えられる原因: AccessKey ペアがリクエストに正しく渡されていません。
解決策: リクエストクライアントを初期化するときに、AccessKey ペアが正しく渡されていることを確認します。
getenv("XXX")のXXX値は、環境変数から取得されます。Alibaba Cloud SDK によってスローされた「code: 414 URL Too Long」エラーを処理するにはどうすればよいですか?
考えられる原因: この問題は、リクエストメソッドが原因ではありません。 Alibaba Cloud SDK を使用する場合、リクエストパラメータは URL で渡されます。 URL に過剰な数のパラメータまたは長すぎるパラメータ値が含まれている場合、URL が最大長を超えてリクエストが失敗する可能性があります。
解決策: URL が長くなりすぎるのを防ぐために、リクエスト構文と署名メソッド V3 を使用することをお勧めします。 自己署名署名を使用してリクエスト本文でパラメータを渡し、本文タイプを
Content-Type: application/x-www-form-urlencodedに設定します。
SDK エラーの処理方法の詳細については、「よくある質問」をご参照ください。