AWS SDK for PHPで、まとめて送信する方法について記載します。
ご存知かとは思いますが、AWS SDK for PHP は、Guzzleをベースとして実装されているので、Guzzleの機能がほぼ利用できます。
今回説明する方法は、Guzzleの機能を利用しているので、Guzzleベースのものであれば、だいたい使えるんじゃないかと思います。
環境
- AWS SDK for PHP v2.6.15
- Guzzle v3.9.2
- PHP 5.4
なお、今回利用したバージョンは上記になりますが、AWS SDK for PHPなら、ほぼすべてのバージョンで使えるんじゃないかと思います、
ただ、AWS SDK for PHP v3 からは、Guzzle自体のバージョンも上がって確認してないので、保証できません...。
実装例
以下の実装は、AWS SNS の publish コマンドを例に実装していますが、他のサービスやメソッドでも、すべて同様に実装ができるので参考として考えてください。同様に publish コマンドだけではなく、複数の他のコマンドを並列で送信できるので、依存関係がないリクエストを、並列で処理させることもできると思います(やったことないけど...)
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
$aws = Aws::factory([
'key' => '<your key>',
'secret' => '<your secret>',
'region' => Region::AP_NORTHEAST_1
]);
$sns = $aws->get('Sns');
// 共通の送信内容を作成
$apnsMessage = json_encode([ 'aps' => [ 'alert' => 'hogehoge' ] ], JSON_UNESCAPED_UNICODE);
$message = json_encode([ 'APNS' => $apnsMessage ], JSON_UNESCAPED_UNICODE);
$publishArgs = [
'MessageStructure' => 'json',
'Message' => $message
];
// publishのコマンドを まとめて作成
$commands = [];
foreach ($endpointArns as $targetArn) {
$publishArgs['TargetArn'] = $targetArn;
$commands[] = $sns->getCommand('publish', $publishArgs);
}
try {
// 作成したコマンドを まとめて送信(全リクエストに応答があったら戻ってくる)
$succeeded = $sns->execute($commands);
} catch (\Guzzle\Service\Exception\CommandTransferException $e) {
$succeeded = $e->getSuccessfulCommands();
$failed = $e->getFailedCommands();
// それぞれのコマンドの失敗内容に応じて処理する
foreach ($failed as $failedCommand) {
/** @var \Aws\Common\Command\QueryCommand $failedCommand */
$exception = $e->getExceptionForFailedCommand($failedCommand);
// 失敗したリクエストの内容を取得したい場合はこんな感じ
/** @var \Guzzle\Http\Message\EntityEnclosingRequest $request */
$request = $failedCommand->getRequest();
if ($exception instanceof \Aws\Sns\Exception\InvalidParameterException) {
// InvalidParameterException に対して処理したい場合とか
}
}
} catch (\Exception $e) {
// 通信以外でのエラーとか
}
注意点
通常の Sns::publish コマンド(メソッド)を利用した場合、AWS SDK の Exception が throw されますが、Guzzle の機能を使って並列送信した場合は、Guzzle の CommandTransferException が throw されて、その Exception が、それぞれのリクエストでの失敗内容を持っています。
参考
今回の実装と同様の、他コマンドでの実装は以下のものを参考にすると良いと思います。
- AWS S3の例: AWS SDK for PHP を使用したオブジェクトのコピー
間違いあればコメントなど頂ければと思います。。。