FlexとPHPでAMFPHPを使ってAMF通信

はじめに

Flexでサーバサイドとの通信を行う際は、XMLJSONなどのテキストベースのフォーマットを使用することが可能なのだが、AMF(ActionScript Message Format)と呼ばれるバイナリフォーマットを使用することができるらしく、このフォーマットを使うことにより軽量で高速にFlexとサーバ間との通信を行うことができるようになるらしい。
今回はそのAMFを使用してPHPとの通信をやってみたいと思います。

今回使用するAMFライブラリについて

PHPでAMF通信を行う際に用いるライブラリはいくつか公開されているそうです。

今回はその中でも古くからあり、実績もあるAMFPHPを使用してみたいと思います。
AMFPHPを使うとphpで作成したクラスがそのままFlexから呼び出すことができます。
このライブラリを使用することによりFlexからPHPのクラスを呼びだすことができます。

  • AMFPHP
    • http://amfphp.org/より、ダウンロード
    • 「amfphp-X.X.beta.XXXXXXX.zip」を解凍しドキュメントルートに配置
    • 「amfphp/gateway.php」を元にGateway.phpをドキュメントルートに作成
<?php
// Gateway.php
include 'amfphp/core/amf/app/Gateway.php';
function main(){
    $gateway = new Gateway();
    $gateway->disableDebug();
    $gateway->setClassPath(".");
    $gateway->enableGzipCompression(25*1024);
    $gateway->service();
}
main();
?>
  • PHP
    • Flex側で入力された文字を返すクラスを作成する
<?php
// Service.php
class Service{
    public function returnName($name){
        return $name."さん、こんにちは";
    }
}
?>
  • Flex
    • 適当な名前でプロジェクト及び「MXMLアプリケーション」を作成
// hoge.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
	<mx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import flash.net.*;
			// ゲートウェイ
			private const GATEWAY:String = "/Gateway.php";

            // データ送信
			private function doRequest():void{
				// レスポンダーを作成
				var responder:Responder = new Responder(onSuccess, onFault);
				// コネクションの作成
				var connection:NetConnection = new NetConnection();
				// コネクト
				connection.connect("http://localhost/devamfphp/Gateway.php");

				connection.objectEncoding = ObjectEncoding.AMF3;

				// PHPのServiceクラスのreturnNameメソッドを呼び出す
				connection.call("Service.returnName", responder, nameText.text);	
			}
			
			// データ取得成功
			private function onSuccess(e:*):void{
				// 返却値をAlertで表示
				Alert.show(e.toString());
			}
			
			// データ取得失敗
			private function onFault(e:*):void{
				Alert.show("通信失敗");
			}
			
			
		]]>
	</mx:Script>
	<mx:TextInput id="nameText" />
	<mx:Button label="Submit" click="doRequest()"/>
	<mx:Label text="name" />
</mx:Application>
    • 上記クラスをビルドしたら、swfファイルをドキュメントルートに配置
  • 実行

ちゃんと値は返ってきましたか?