yasutomogのブログ

Software Engineerの雑記

PHP(Lumen)からAzure Storage Tableを使ったときのメモ1

内容

  • Lumenで構築しているWebアプリケーションからAzure Storage Tableを使ったときのメモ
  • PHPからの接続は、MSの公開ライブラリを使用(以下の方法でライブラリ追加)
    • composer require microsoft/azure-storage-table

バージョン

github.com

前準備

ストレージアカウントを作成

  • 以下のリンクを参考にして、ストレージアカウントを作成し適当な名前でTableを新規作成

docs.microsoft.com

Azure Storage Tableを確認するためのツールをインストール

  • Azure Portalからは現時点ではTableが確認できてない
  • MSから公式のクライアントツールが提供されている(Mac版もある)

docs.microsoft.com

ライブラリの使用方法

  • 基本的には以下のリンクの方法でTable操作とEntity操作は問題なくいける

docs.microsoft.com

実装ポイント

Entityの検索処理

  • Key検索ではなくパーティションを条件に全件検索などするときに、1度に返される結果件数は1000件の制限がある
  • 検索結果が1000件より多い場合は、検索結果のcontinuationTokenを使用して次の1000件を取得するような実装が必要になる

サンプルコード

// SampleTableからの検索結果
$entities = [];
do {
    $result = $tableClient->queryEntities('SampleTable', $options);
    $entities = array_merge($entities, $result->getEntities());
    $options->setContinuationToken($result->getContinuationToken());
} while($result->getContinuationToken());

複数Entity操作処理

  • 複数行まとめて追加や更新などしたいときには、Batch処理としてまとめて処理することが可能
  • 1Entityごとに処理するよりもBatch処理を使用する方がパフォーマンス的にも良い
  • 但し、1Entityに対しての複数操作をBatchでまとめるのはやめてというのがドキュメントに記載されている

サンプルコード

$batchOperations = new BatchOperations();
foreach ($records as $rec) {
    $entity = new Entity();
    $entity->setPartitionKey('hoge');
    $entity->setRowKey('fuga');
    $entity->addProperty("propKey1", 'propVal1');
    $entity->addProperty("propKey2", 'propVal2');

    if (count($batchOperations->getOperations()) % 100 === 0) {
        $tableClient->batch($batchOperations);
        $batchOperations = new BatchOperations();

    }
}

if (count($batchOperations->getOperations()) % 100 !== 0) {
    $tableClient->batch($batchOperations);
}