書籍転載
Windows Azure 実践クラウド・プログラミング
for C#/Visual Basic/PHP

PHPでWindows Azureテーブル・ストレージを活用しよう
― Chapter 7 PHPによるWindows Azureアプリケーション開発(後編) ―

山田 祥寛
2010/09/15
Page1 Page2

本コーナーは、秀和システム発行の書籍『Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『Windows Azure 実践クラウド・プログラミング』の詳細は「目次情報ページ」もしくは秀和システムのサイトをご覧ください。

ご注意:本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

7-3テーブルストレージ利用の基本

 続いて、テーブルストレージにアクセスしてみましょう。本節で作成するのは、一言掲示板です。

図7-24:投稿内容を一覧表示

[1]テーブル接続の準備を行う

 アプリケーションを作成する前に、MyLib.phpにブロブ操作のためのテーブルクライアントを作成するcreateTableStorageClient関数を追加します。createTableStorageClient関数は、プロジェクトにデフォルトで用意されているサンプルTableSample.phpに含まれているものをほぼそのまま利用しています。

<?php
require_once 'Microsoft/WindowsAzure/Storage.php';
require_once 'Microsoft/WindowsAzure/Storage/Table.php';
require_once 'Microsoft/WindowsAzure/Storage/Blob.php';
require_once 'Microsoft/WindowsAzure/Credentials.php';
...中略...

function createTableStorageClient()
{
  // クラウド環境にある場合...
  if (isset($_SERVER['USERDOMAIN']) && $_SERVER['USERDOMAIN']
    == 'CIS')
  {
   
    // サービス設定ファイルの定義に従ってテーブルクライアントを作成
    $host = Microsoft_WindowsAzure_Storage::URL_CLOUD_TABLE;
    $accountName = azure_getconfig('AzureCloudStorageAccountName');
    $accountKey = azure_getconfig('AzureCloudStorageAccountKey');
    $usePathStyleUri = false; *28

    $retryPolicy =
      Microsoft_WindowsAzure_RetryPolicy::retryN(10, 250);

    $tableStorageClient =
      new Microsoft_WindowsAzure_Storage_Table(
        $host,
        $accountName,
        $accountKey,
        $usePathStyleUri,
        $retryPolicy
      );

  }
  else
  {
   
    // ローカル環境では、デフォルトの設定で開発ストレージに接続
    $tableStorageClient =
      new Microsoft_WindowsAzure_Storage_Table();
  }

  return $tableStorageClient;
}
リスト7-5 MyLib.php

*28 サンプルではtrue設定になっていますが、そのままでは本番ストレージにアクセスできません。falseに変更してください。

 テーブルストレージへのアクセスを管理するのは、Microsoft_WindowsAzure_Storage_Tableクラスです。

__construct([string $host = Microsoft_WindowsAzure_Storage::URL_DEV_TABLE [,string $account = Microsoft_WindowsAzure_Credentials::DEVSTORE_ACCOUNT [,string $key = Microsoft_WindowsAzure_Credentials::DEVSTORE_KEY [,bool $usePath = FALSE [,Microsoft_WindowsAzure_RetryPolicy $retry]]]]])
構文 Microsoft_WindowsAzure_Storage_Tableクラス(コンストラクタ)
$host:ホスト名
$account:アカウント名
$key:アクセスキー
$usePath:パス形式のURIを利用するか
$retry:再試行の回数/間隔

 リスト7-5では、アプリケーション環境に応じて本番のストレージサービスにアクセスするか()、開発ストレージにアクセスするか()を決めています。Microsoft_WindowsAzure_Storage_Tableコンストラクタですべての引数が省略された場合、開発ストレージに接続するためのテーブルクライアントを作成します。

*29 開発ファブリックから本番ストレージにアクセスする方法については、「PHPでWindows Azureブロブ・ストレージを活用しよう」の「【Note】開発ファブリックから本番ストレージにアクセスするには?」も参考にしてください。

[2]エンティティクラスを定義する

 テーブルに格納するためのエンティティを定義します。エンティティは、Microsoft_WindowsAzure_Storage_TableEntity派生クラスとして定義する必要があります。

<?php
require_once 'Microsoft/WindowsAzure/Storage/Table.php';

class Message extends Microsoft_WindowsAzure_Storage_TableEntity
{
  /**
  * @azure Name Edm.String
  */
  public $Name;

  /**
  * @azure Url Edm.String
  */
  public $Url;

  /**
  * @azure Body Edm.String
  */
  public $Body;
}
リスト7-6 Message.php

 エンティティクラスの中身は、プロパティ(パブリックなメンバ変数)の定義のみですが、一点のみ、

ドキュメンテーションコメントとしてプロパティのデータ型を明示する必要がある

点に注意してください。記述の形式は、以下の通りです。

/**

* @azure プロパティ名 データ型

*/

 指定できるデータ型は、表7-3の通りです。

データ型 概要
Edm.Binary バイト配列(64キロバイト以下)
Edm.Boolean ブール値
Edm.DateTime UTC時刻(1601/1/1.9999/12/31)
Edm.Double 浮動小数点値(64ビット)
Edm.Guid グローバル一意識別子(128ビット)
Edm.Int32 整数値(32ビット)
Edm.Int64 整数値(64ビット)
Edm.String 文字列(64キロバイト以下)
表7-3 エンティティで指定可能なデータ型

 本サンプルでは、文字列型のName、Url、Bodyプロパティを定義しています。

[3]メッセージ投稿&一覧表示のコードを記述する

 新規のBbs.phpを作成し、リスト7-7のようなコードを記述します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>一言掲示板</title>
</head>
<body>
<!--ポストデータは自分自身に送信-->
<form method="POST" action="">
  名前:
  <input type="text" name="txtName" /><br />
  URL:
  <input type="text" name="txtUrl" size="50" /><br />
  本文:
  <input type="text" name="txtBody" size="75" /><br />
  <input type="submit" value="投稿" />
</form>
<?php
require_once 'MyLib.php'; // 自作の関数ライブラリ
require_once 'Message.php'; // エンティティの定義

// テーブルクライアントの取得
$cli = createTableStorageClient();

// テーブルが存在しない場合、新規に作成
if (!$cli->tableExists('Message')) {
  $cli->createTable('Message');
}


// 名前、本文が入力された場合、エンティティの追加処理
if (isset($_POST['txtName']) && isset($_POST['txtBody'])) {
  // エンティティを生成&追加
  $msg = new Message('php', sprintf(
    '%013d', gmmktime(0, 0, 0, 1, 1, 2038) - gmmktime()));
  $msg->Name = urlencode($_POST['txtName']);
  $msg->Url = urlencode($_POST['txtUrl']);
  $msg->Body = urlencode($_POST['txtBody']);
  $result = $cli->insertEntity('Message', $msg);
}


// 指定された条件でエンティティセットを取得&順に表示
$entities = $cli->retrieveEntities(
  'Message', 'PartitionKey eq \'php\'', 'Message');
?>
<table border="1">
<tr>
  <th>名前</th><th>本文</th><th>投稿日時</th>
</tr>
<?php foreach ($entities as $entity) { ?>
  <tr>
  <td><?php e(urldecode($entity->Name)); ?></td>
  <td><?php e(urldecode($entity->Body)); ?></td>
  <td><?php e(urldecode($entity->getTimestamp())); ?></td>
  </tr>
<?php } ?>

</table>
</body>
</html>
リスト7-7 Bbs.php

 スクリプト全体の構造はリスト内のコメントを参照頂くとして、以下ではテーブル操作に関わる部分をいくつかのブロックに分けて解説していきます。

テーブルを作成する

 エンティティを保存するためのテーブル(ここではMessage)を作成します。tableExistメソッドでテーブルの存在チェックを行った後、存在しない場合にのみcreateTableメソッドで作成処理を行います。

 これまでの繰り返しですが、テーブルの作成は本来、アプリケーションロジックの一環として行うべきものではありません。実際のアプリケーションでは、セットアップ用のスクリプトを用意して、あらかじめ実行するようにしてください。

投稿をテーブルに登録する

  は[投稿]ボタンをクリックした時の処理です。テーブルにデータを登録するには、まず対応するエンティティ(オブジェクト)を作成します。エンティティのコンストラクタは、以下の通りです。

__construct(string $part, string $row)
構文 Microsoft_WindowsAzure_Storage_TableEntityクラス(コンストラクタ)
$part:パーティションキー
$row:行キー

 サンプルでは、パーティションキー(引数$part)には固定で"php"とセットしていますが、(たとえば)掲示板に応じて識別のためのコードを入力するようにしても良いでしょう。行キーには、2038/01/01のタイムスタンプ値から現在時刻のタイムスタンプ値を差し引いたものを13桁の固定長文字列でセットしています。これは投稿を新しい順にソートするための措置です。

 エンティティ(オブジェクト)を作成できたら、あとは必要なプロパティをセットし、insertEntityメソッドでテーブルに投入するだけです。

Microsoft_WindowsAzure_Storage_TableEntity insertEntity(string $table, Microsoft_WindowsAzure_Storage_TableEntity $entity)
構文 insertEntityメソッド
$table:テーブル名
$entity:投入するエンティティ

エンティティの一覧を取得する

 テーブル配下のエンティティセットを取得するには、retrieveEntitiesメソッドを呼び出します。

array retrieveEntities(string $table, string $filter [,string $entity = 'Microsoft_WindowsAzure_Storage_DynamicTableEntity'])
構文 retrieveEntitiesメソッド
$table:テーブル名
$filter:抽出条件
$entity:エンティティのクラス名

 引数$filterには、エンティティ取得のための条件式を指定します。リスト7-7では、パーティションキーがphpであるエンティティをまとめて取得しています。

 retrieveEntitiesメソッドは、Microsoft_WindowsAzure_Storage_TableEntityオブジェクトの配列を返しますので、あとは、これをforeachループで順に取り出すだけです。getTimestampメソッドは、エンティティの更新日時を返すためのメソッドです。

 ちなみに、パーティションキー/行キーで特定のエンティティを取得したい場合には、retrieveEntityByIdメソッドを利用することもできます。

Microsoft_WindowsAzure_Storage_TableEntity retrieveEntityById(string $table, string $part, string $row [,string s$entity = 'Microsoft_WindowsAzure_Storage_DynamicTableEntity'])
構文 retrieveEntityByIdメソッド
$table:テーブル名
$part:パーティションキー
$row:行キー
$entity:エンティティのクラス名

[4]サンプルの動作を確認する

 以上の手順を終えたら、開発ファブリックでサンプルを実行してみましょう。本稿冒頭の図のようなページが表示されたら、記事を正しく投稿できること、投稿内容が一覧表に正しく反映されることを確認してください。

 次のページでは、本章最後のテーマとして、PHPアプリケーションからSQL Azureに接続する手順を解説します。


 INDEX
  [書籍転載]Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP
  PHPでWindows Azureテーブル・ストレージを活用しよう
  1.テーブルストレージ利用の基本
    2.SQL Azure利用の基本

インデックス・ページヘ 「Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH