これまでの記事ではswfmillの変換はproc_openを使っていましたが、
サーバー環境によってはproc_openが使えないケースがあるとの情報を頂きましたので
proc_open以外の関数を使った変換方法をご紹介します。
proc_openよりも分かりやすい書き方を希望される方にも参考になるかと存じます。
※指摘のあった環境は「Windows2003サーバー + IIS + PHP5」ですが、同様の環境での確認は行っていません。
→参照:「ケータイFlashで埋め込みフォントを表示してみよう」:記事コメント
実現方法
proc_openを使った変換では標準入力・標準出力をあらかじめ指定しておき、一度読み込んだデータをそのまま次の処理に渡していっていますが、
入力をファイルパスにしておけばshell_exec関数でも変換可能です。
この場合、変換中に一旦XMLファイルをどこかに保存する必要がでてきます。
PHPファイルソース
sample5290.php
<?php /* * swfのテキストとリンクを置換して出力するサンプル */ // ソースSWFファイル名 $sourceFile = 'sample5290.swf'; // 一時ファイル保存ディレクトリ $tmpDir = '/tmp/'; // 一時ファイル名 $tmpFile = uniqid(rand()) . '.xml'; // swfmill実行ファイルパス $swfmillPath = '/usr/local/bin/swfmill'; // swfmill変換エンコードオプション $encodeOption = '-e cp932'; // ソースSWFファイルの絶対パス $sourceFilePath = realpath($sourceFile); // 一時ファイルパス $tmpFilePath = dirname($sourceFilePath) . $tmpDir . $tmpFile; // SWFからXMLに変換 $xmlString = shell_exec("{$swfmillPath} {$encodeOption} swf2xml {$sourceFilePath}"); // 文字列置換 // 置換する値を連想配列で設定 $replaceStrings = array( 'titleText' => "携帯サイトをつくろう。", 'commentText' => "携帯サイト制作のための\n役立つ情報満載サイト", 'linkText1' => "→新着記事", 'linkText2' => "→カテゴリ一覧", 'linkUrl1' => "/Sample/post5290/link1/", 'linkUrl2' => "/Sample/post5290/link2/", ); foreach($replaceStrings as $key => $value){ // 文字列内の改行を置換 $value = str_replace("\n", ' ', $value); // 文字列を連想配列の値に置換 $xmlString = str_replace('{$' . $key . '}', $value, $xmlString); } // ファイルを一時的に保存 file_put_contents($tmpFilePath, $xmlString); // XMLからSWFに変換 $swfOutput = shell_exec("{$swfmillPath} {$encodeOption} xml2swf {$tmpFilePath}"); // 一時的に保存していたファイルを削除 unlink($tmpFilePath); // SWFのヘッダを出力 header('Content-type: application/x-shockwave-flash'); // SWFのデータを出力 echo $swfOutput;
※UTF-8で記述しています。
※同階層に書き込み可能権限でディレクトリ「tmp」を配置しています。
※Flashファイル及び変換処理は基本的に下記記事とほぼ同様です。
→参照:「swfmillでケータイFlashを動的生成してみよう(文字列置換編)」
実行例
実行例はこちらからご確認下さい。
→URLをメールで送る
http://ookura.tanikaze.com/Sample/post5290/
サンプルファイル
sample5290.zip
上記サンプルのFlashファイル一式です。