連載
» 2011年09月02日 00時00分 公開

無料クラウドでできるFacebookアプリ開発入門(4):Twitterと連携するFacebookアプリをPHPで作る (4/5)

[田口一博, 浅見城輝, 大澤公志郎,@IT]

パッケージ化してローカルのエミュレータで動作確認

 本番へ展開する前に、ローカルのエミュレータであるCompute Emulatorで、アプリの動作を確認してみましょう。

サービス定義ファイルとサービス構成設定ファイルを作成

 その前に、パッケージを作成するのに必要なサービス定義ファイルと、実行するために必要なサービス構成設定ファイルを作成する必要があります。作成したファイルは、「wwwroot」フォルダの親フォルダ(通常は「C:\inetpub」、以下「inetpub」)に追加します。

 まずは、サービス定義ファイル(今回は、「ServiceDefinition.csdef」)を作成します。以下のような内容で、エンドポイントの設定を定義して作成します(参考:Windows Azure Service Definition Schema)。

ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="PHPSample"
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole" enableNativeCodeExecution="true">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
  </WebRole>
</ServiceDefinition>

 次に、サービス構成設定ファイル(今回は、「ServiceConfiguration.cscfg」)を作成します。今回は、以下のような内容で、Guest OSには2.x系を設定します(参考:Service Configuration Schema)。

ServiceConfiguration.cscfg
<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="PHPSample"
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"
  osFamily="2" osVersion="*">
  <Role name="WebRole">
    <Instances count="1" />
  </Role>
</ServiceConfiguration>

CSpackとCSRunを使ったパッケージ化と実行

 ファイルの作成が終了したら、Compute Emulatorを使って、アプリを動作させます。Compute EmulatorやAzure本番環境で実行するには、CSPackを使ってサービスのパッケージを作成する必要があります。

 CSPackで作成したエミュレータ用のパッケージは、CSRunを使って実行可能です。

 エミュレータ用のパッケージを作成します。「Azure SDK Command Prompt」を実行(「inetpub」フォルダのUACが有効の場合は、管理者として実行)し、inetpubフォルダに移動します。まず、以下のコマンドを実行し、Compute Emulatorで動作させるパッケージを作成します。

cspack ServiceDefinition.csdef /copyonly /out:SamplePackage.csx
/sitePhysicalDirectories:WebRole;Web;wwwroot /role:WebRole;wwwroot

 「SamplePackage.csx」フォルダが作成されパッケージの作成が終了したら、以下のコマンドを実行します。

csrun SamplePackage.csx ServiceConfiguration.cscfg /launchbrowser

ローカルの「Compute Emulator上」で動作確認

 問題がなければパッケージされたサービスがCompute Emulator上で起動し、Webブラウザが起動されます。

 Webブラウザが起動したら、先ほどと同様に適当なファイルを指定して「アップロード」ボタンをクリックすれば、ページが遷移しファイルの登録が完了します。確認が終わったらWebブラウザを終了します。また、稼働しているCompute Emulatorを停止して削除するため、以下のコマンドを実行します。

csrun.exe /removeall

 この後、本番環境へ展開します。AzureホストサービスとAzureストレージ サービスを使用するので、「Azureデベロッパー ポータル」でホストサービスとストレージアカウントを事前に作成する必要があります。

PHP実行環境をWebアプリと一緒にパッケージ化

 ローカルでの確認が終わったら、本番環境へ展開していきます。その前に少しだけ修正します。ローカルと同様に、本番環境でもPHPのWebアプリを動かす場合には、PHPをインストールして環境を設定する必要があります。

 WebPIを用いてインストールすることも可能ですが、今回は本番と開発環境でPHPのバージョンに差が出ないように、PHPランタイムをWebアプリと一緒にパッケージ化します。スタートアップタスクで、FastCGIとハンドラマッピングの設定を行います。

 最初に、PHPランタイムを含めたパッケージを作成するため、Webサイト内にシンボリックリンクを作成します。

シンボリックリンク作成コマンド例
mklink /d "c:\inetpub\wwwroot\php" "C:\Program Files\PHP\v5.3"

 次に、PHPアプリを実行するための設定を、スタートアップタスクで行います。まず、スタートアップタスクで実行されるバッチとして「setup.cmd」を作成します。setup.cmdでは、PowerShellの実行ポリシーを変更し、script.ps1を実行します。今回は、以下のような内容で作成し、「wwwroot」フォルダの直下に「bin」フォルダを作成して追加します。

setup.cmd
@echo off
powershell -command Set-ExecutionPolicy RemoteSigned
powershell .\script.ps1 "\"%RoleRoot%\""

 次に、setup.cmdから実行されるPowerShellスクリプトとして「script.ps1」を作成します。script.ps1 では、FastCGIとハンドラマッピングの設定を行います。今回は、以下のような内容で作成し、binフォルダに追加します。

script.ps1
Import-Module Webadministration
$phpPath = $Args[0] + "\approot\php\php-cgi.exe"
$basePath = $Args[0] + "\base\x86"
New-WebHandler -Name "PHPHandler" -Path *.php -Verb * -Modules FastCgiModule -ScriptProcessor $phpPath
-PSPath "IIS:\Sites"
Add-WebConfiguration "/system.webServer/fastCgi" -value @{fullPath=$phpPath}
Add-WebConfiguration "/system.webServer/fastCgi/application/environmentVariables" -value
@{name='PATH';value=$basePath}

 次に、サービス構成設定ファイル(ServiceDefinition.csdef)を修正して、スタートアップタスクとしてsetup.cmdを実行するようにします。以下のような内容になります。

ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="PHPSample"
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole" enableNativeCodeExecution="true">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Startup>
      <Task commandLine="setup.cmd" executionContext="elevated" taskType="simple"></Task>
    </Startup>
  </WebRole>
</ServiceDefinition>

 最後に、ファイルの保存先をAzureストレージ サービスに変更します。upload.php の以下の部分を修正します。

$host = Microsoft_WindowsAzure_Storage::URL_CLOUD_BLOB;
$accountName = ‘{ストレージアカウント}’;
$accountKey = ‘{ストレージキー}’;
$usePathStyleUri = false;

ファイルをBlobに保存するPHPアプリをAzureへ展開

 Azure本番環境へ展開していきます。最初に、アップロードする本番用パッケージを作成するために、以下のコマンドを実行します。

cspack ServiceDefinition.csdef /sitePhysicalDirectories:WebRole;Web;wwwroot /role:WebRole;wwwroot

 パッケージ化が終了すると、サービス構成設定ファイルと同じフォルダ内に「ServiceDefinition.cspkg」が作成されるので、「Azureデベロッパー ポータル」にアクセスしてデプロイします。

 デプロイが終わったら、ローカルと同様にWebブラウザでPHPアプリを起動してファイルをアップロードし、確認してください。実際には、異なる環境でアプリが動作していますが、先ほどとほぼ変わりなく動作します。

 ここまで、Azure SDKとエディタを使った、簡単なAzure用PHPアプリの開発方法と、本番環境へのデプロイについて解説してきました。通常のIISで稼働している既存のWebアプリをAzure上へ移行するシナリオなどでも、CSPackとCSRunを使ったデプロイ方法を適用できます。

 次ページからはいよいよ、FacabookアプリをPHP言語でAzure上に作成する方法を解説します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。