© 2011 Microsoft Corporation
モバイルアプリを Azure で作る - 【データを扱う】
Azure Storage を利⽤してデータを保存する
本稿では、PHP と Windows Azure を使って、画像などのファイルを扱うアプリケーションを開発する方法を説明しま す。
Windows Azure Platform では、データの保存先に Azure Storage サービスか SQL Azure を利⽤するのが⼀般的です。 SQL Azure は、SQL を実⾏する RDBMS です。オンプレミスの SQL Server と同じ方法でアクセスすることができる ため、基本的には従来の書き方のまま接続先を SQL Azure に変更するだけでかまいません。
⼀方、Azure Blob(Azure Storage サービス)は、ファイルを扱うストレージサービスではあるものの、⼀般的なファ イルシステムのように利⽤できるわけではありません。
Azure Blob の操作は、HTTP REST インタフェースを利⽤して⾏います。PHP から簡単に使えるようにこれを抽象化し た Windows Azure SDK for PHP(http://phpazure.codeplex.com/)という API が⽤意されています。
この API 特有のメソッドで操作しなければいけないと思われがちですが、カスタムストリームラッパーが⽤意されてい るため、少し変更するだけで fopen や fread、fwrite、file_get_contents、file_put_contents などの従来のファイルシ ステム関数を利⽤することができます。
本稿では Windows Azure SDK for PHP のストリームラッパーを利⽤して Azure Blob への読み書きをする方法を紹介 します。
■PHP の実⾏と開発環境について
本稿での PHP の実⾏と開発環境については、事前に準備がされているものとします。環境構築については Windows Azure で PHP を実⾏する各種資料を参考にしてください。 本稿では以下の環境で動作を確認しています。 ・Windows 7 Ultimate Edition(64bit) ・Windows Azure SDK 1.4・Windows Azure SDK for PHP v3.0.0BETA ・PHP 5.3.6
■Azure Storage サービスの準備
本稿のプログラムを Windows Azure 上で実⾏するには、Azure Storage の初期設定がされている必要があります。 Windows Azure ポータル(https://windows.azure.com/)で Storage Account を作成しておいてください。
開発環境で実⾏するには、Storage Emulator が起動されている必要があります。
© 2011 Microsoft Corporation
■Azure Storage へのコンテナの作成とサンプルファイルの配置
本稿のサンプルで利⽤するファイルを Azure Storage にコピーします。
今回は、本番環境の Azure Storage と開発環境の Development Storage の両方に対応する、Azure Storage Explorer を利⽤します。
Azure Storage Explorer はhttp://azurestorageexplorer.codeplex.com/から入手してください。 1. Azure Storage Explorer を起動し、[Add Account]をクリックします。
2.
「Add Storage Account」ダイアログで Azure ストレージのアカウント名とキーを入⼒します。 開発環境の場合は「Developer Storage」をチェックします。3. コンテナを作成します。 「Container」ツールボタンの「New」をクリックし、適当なコンテナ名を入⼒します。(ex. sample) Accessibility は今回は Private を選択します。 4. 作成したコンテナを選択し、「Blob」ツールボタンの「New」をクリックします。 5. New Blob ダイアログで以下を入⼒します。
Blob name: 任意のファイル名(ex. samplefile.txt) Blob Type: Block Blob を選択
© 2011 Microsoft Corporation
6.
以上で Azure Blob にファイルが作成されました。© 2011 Microsoft Corporation
■Windows Azure SDK for PHP の配置
http://phpazure.codeplex.com/releases/から最新版の Windows Azure SDK for PHP をダウンロードして解凍し、 library\Microsoft フォルダをプロジェクトの任意の場所にコピーします。 WebRole のフォルダ構成例 + WebRole + bin\ + php\ + php-cgi.exe + php.ini : + lib\ + Microsoft\ ← ここにコピー : + index.php + web.config :
※ Windows Azure Tools for Eclipse を使っている場合、デフォルトで作られている WindowsAzureSDKForPHP フォル ダに SDK のファイルが存在します。これを利⽤する場合、バージョンが古い可能性があるので注意してください。
■Azure Blob にアクセスするためにストリームラッパーを登録
いよいよプログラムを書いていきます。 まず、必要な SDK を読み込みます。
// include_path を指定します。Windows Azure Tools for Eclipse のデフォルトの場合は // 'lib'の代わりに'WindowsAzureSDKForPHP'とします。
// php.ini で設定しても構いません。
set_include_path(ini_get('include_path') . PATH_SEPARATOR . './lib');
// SDK を読み込みます。
require_once 'Microsoft/WindowsAzure/Storage/Blob.php'; require_once 'Microsoft/WindowsAzure/RetryPolicy/NoRetry.php';
Azure ストレージアカウント情報を定義します。
開発環境(Development Fabric)の場合、Development Storage への接続情報を登録します。
$storageUrl = Microsoft_WindowsAzure_Storage::URL_DEV_BLOB; $storageAccount = 'devstoreaccount1';
$storageKey =
'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KB HBeksoGMGw==';
© 2011 Microsoft Corporation
本番環境(Windows Azure Fabric)の場合、Azure Storage への接続情報を登録します。
$storageUrl = Microsoft_WindowsAzure_Storage::URL_CLOUD_BLOB,
$storageAccount = 'YOURESTORAGEACCOUNT'; // YOURESTORAGEACCOUNT をアカウント名に置き換えます
$storageKey = 'YOURSTORAGEACCOUNTKEY'; // YOURSTORAGEKEY をストレージキーに置き換えます
Blob インスタンスの初期化し、ストリームラッパーを登録します。
// Blob インスタンスを初期化します
$cli = new Microsoft_WindowsAzure_Storage_Blob( $storageUrl, $storageAccount, $storageKey, false, Microsoft_WindowsAzure_RetryPolicy_RetryPolicyAbstract::retryN(10, 250) ); // ストリームラッパーを登録します $cli->registerStreamWrapper();
■テキストファイルの読み書き
ここからは通常通りファイルシステム関数を利⽤します。 fopen などで指定するファイル名は、「azure://{コンテナ名}/{ファイル名}」となります。サンプルは、sample.php で す。 $file = 'azure://sample/samplefile.txt'; // 事前に作成済みのファイル $handle = fopen($file, 'r+'); // ファイルを読み書きモードでオープンします$content = fread($handle, filesize($file)); // ファイルの内容をすべて読み込みます
echo '<pre>' . $content . '</pre>'; // 読み込んだファイルの内容を出⼒します
fwrite($handle, "\n 書き込んでみます。"); // ファイルに書き込みます fclose($handle); // ファイルをクローズします echo '<hr /><pre>'; readfile($file); // 変更後のファイル内容を出⼒します echo '</pre>'; 結果表⽰例)※ブラウザで⽂字化けする場合は⽂字コードを調整してください Azure blob ストレージに保存した テキストファイルの内容です。 Azure blob ストレージに保存した テキストファイルの内容です。 書き込んでみます。
© 2011 Microsoft Corporation
■ファイルのアップロード
ファイルをアップロードするには、move_uploaded_file でファイルの移動先に「azure://{コンテナ名}/{ファイル名}」 と指定します。サンプルは、sample2.php です。
echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">' . '<type="hidden" name="MAX_FILE_SIZE" value="3000000" />'
. '<input type="file" name="f" />' . '<input type="submit" name="s" />' . '</form>';
if (count($_FILES) > 0) {
move_uploaded_file($_FILES['f']['tmp_name'], 'azure://sample/' . $_FILES['f']['name']); }
Web ブラウザからファイルをアップロード後、Azure Storage Explorer などでファイルが作成されていることを確認し てください。
簡単な説明ではありましたが、このように従来のファイルシステム関数で Azure Blob 上のファイルを参照、変更した り、ファイルをアップロードすることができることがお分かりいただけたと思います。
とは言え、fopen で存在しないファイルを指定すると通常であればファイルが作られるはずがエラーになってしまった り、disk_free_space と disk_total_space については Warning が出てしまったりなど、すべての機能が実装されている わけではありません。
このような制限もありますが、Windows Azure SDK for PHP のストリームラッパーを利⽤すると、既存のオンプレミ スから Windows Azure Platform へ移⾏する労⼒や、新しいノウハウを習得するための労⼒を最⼩限にすることができる ので、ぜひご活⽤ください。