LoginSignup
19
20

More than 5 years have passed since last update.

AWS SDK for PHP でバッチ(並列)送信する方法

Last updated at Posted at 2014-10-20

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 が、それぞれのリクエストでの失敗内容を持っています。

参考

今回の実装と同様の、他コマンドでの実装は以下のものを参考にすると良いと思います。

間違いあればコメントなど頂ければと思います。。。

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20