swfmillの変換を別のサーバーで行うには(実践編)

By ookura - 09/06/19 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

別のサーバーにswfmillをインストールしてswfとxmlの相互変換処理のみ実行させ、HTTP通信で送受信する方法について説明します。
単純にHTTP通信とswfmill変換処理を組み合わせただけです。
 
なお、今回のサンプルではリクエスト側とレスポンス側を同じサーバーに配置していますが、別のサーバーに配置しても問題なく動作します。
 
 

関連記事

HTTP通信の方法についてはこちら。
→参照:「swfmillの変換を別のサーバーで行うには(通信編)」
 
swfmillでのFlash動的変換についてはこちら。
→参照:「swfmillでケータイFlashを動的生成してみよう(文字列置換編)」
 
swfmillのインストール方法についてはこちら。
→参照:「swfmillでケータイFlashを動的生成してみよう(インストール編)」
 
 

動的変換する元SWFファイルの作成

内容を「{$text1}」としたダイナミックテキストをステージ中央に配置しました。
確認のためFlashLite1.1とFlashLite2.0の両方のバージョンを用意しておきました。
 
 

リクエスト側PHPの処理

1.SWFを読み込みます。
2.変換処理にSWFを送信してXMLを読み込みます。
3.XMLデータの内容を置換します。
「{$text1}」を任意の文字列に置換するようにしました。
4.変換処理にXMLを送信してSWFを読み込みます。
5.SWFを出力します。
 
以下のような記述になります。
sample3859.php

<?php
/* 
 * HTTP通信でのSWF変換処理のサンプル(リクエスト処理)
 */

// ライブラリ読み込み
require_once 'Zend/Http/Client.php';

// 初期設定
// 呼び出しURL
$responseUrl = 'http://変換スクリプトを配置したURL/sample3859_response.php';

// 生成するFlashLiteのバージョン
$pattern = (int)$_GET['pattern'];

// FlashLite1.1版の場合
// 読み込むSWFを指定
$originalSwfpath = 'sample3859_lite_1_1.swf';
// 変換エンコードはSJIS
$encode = 'sjis';
// FlashLite2.0版の場合
if ($pattern === 1) {
    // 読み込むSWFを指定
    $originalSwfpath = 'sample3859_lite_2_0.swf';
    // 変換エンコードはUTF-8
    $encode = 'utf8';
}

// HTTP通信設定
$httpSendConfig = array(
    'maxredirects' => 0,
    'useragent'    => 'PHP/' . phpversion(),
    'timeout'      => 120,
);

// 元SWFのデータを取得
$swfData = file_get_contents($originalSwfpath);

// XMLへの変換リクエスト
$client = new Zend_Http_Client();
$client->setUri("{$responseUrl}?mode=swftoxml&encode={$encode}");
$client->setConfig($httpSendConfig);
$client->setRawData($swfData, 'application/x-shockwave-flash');
$response = $client->request('POST');
$statusCode = $response->getStatus();
if ($statusCode !== 200) {
    throw new Exception('Failed to convert swftoxml');
}
$xmlData = $response->getBody();

// 置換処理
// 置換文字列を設定
$replaceStrings = array(
    'text1'   => '携帯サイトをつくろう。',
);
// 各置換文字列を置換
foreach($replaceStrings as $key => $value){
    
    // 文字列を連想配列の値に置換
    $xmlData = str_replace('{$' . $key . '}', $value, $xmlData);
    
}

// SWFへの変換リクエスト
$client = new Zend_Http_Client();
$client->setUri("{$responseUrl}?mode=xmltoswf&encode={$encode}");
$client->setConfig($httpSendConfig);
$client->setRawData($xmlData, 'text/xml');
$response = $client->request('POST');
$statusCode = $response->getStatus();
if ($statusCode !== 200) {
    throw new Exception('Failed to convert xmltoswf');
}
$swfData = $response->getBody();

// 出力処理
header('Content-type: application/x-shockwave-flash');
echo $swfData;

?>

 
 

レスポンス側PHPの処理

こちらは
・SWFからXMLへの変換
・XMLからSWFへの変換
の2通りの処理が必要になります。
 
また、FlashLiteのバージョンによって変換エンコードを変更する必要があります。
 
swfmillの処理を関係のないサーバーから呼び出されないようにIP制限をかけています。
 
swfillのエラーを出力する「swfmill_error_log」は書き込み可能な権限で別に配置しておきます。
 
以下のような記述になります。
sample3859_response.php

<?php
/* 
 * HTTP通信でのSWF変換処理のサンプル(レスポンス処理)
 */

// 呼び出し元のIPを制限
if ($_SERVER['REMOTE_ADDR'] !== '呼び出し元サーバーIP') {
    exit;
}

$swfmillBinPath = '/usr/local/bin/swfmill';

// 変換モード
$mode = $_GET['mode'];
$commandMode = 'swf2xml';
if ($mode === 'xmltoswf') {
    $commandMode = 'xml2swf';
}

// エンコード
$encode = $_GET['encode'];
$commandEncode = '';
if ($encode === 'sjis') {
    $commandEncode = ' -e cp932';
}

// Flash変換エラーログファイルのパス
$swfmillLogPath = 'swfmill_error_log';

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file", $swfmillLogPath, "a")
);

// データを受信
$input = file_get_contents("php://input");

// swfmillコマンドを実行してリソースとファイルポインタを取得
$process = proc_open("{$swfmillBinPath} {$commandEncode} {$commandMode} stdin stdout", $descriptorspec, $pipes);

if (is_resource($process)) {
    // 標準入力にSWFファイルのバイナリデータを書き込み
    fwrite($pipes[0], $input);
    fclose($pipes[0]);
    
    // 標準出力からXMLデータを読み込み
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    
    // パイプを全て閉じてからプロセスを閉じる
    proc_close($process);
}

// 出力
echo $output;

?>

 
 

実行例

実行例はこちらからご確認下さい。

URLをメールで送る
http://ookura.tanikaze.com/Sample/post3859/
 
 

関連ページ

ケータイFlash関連の記事一覧